gpt4 book ai didi

c# - 无法在自定义类上调用 JavascriptSerialize

转载 作者:太空宇宙 更新时间:2023-11-03 22:18:04 24 4
gpt4 key购买 nike

我有一个图形对象,我需要对其进行序列化。无论我实现哪些成员,该方法都会返回 {}

string json = new JavascriptSerializer().Serialize(routeGraph);

这是我的图形类:

namespace GraphClass
{
[Serializable, DataContract]
public class Graph : ISerializable
{
[DataMember]
readonly Dictionary<string, Node> nodeMap = new Dictionary<string, Node>();
[DataMember]
private Tuple<string, string, double> bufferOriginalOffer;
}
[Serializable, DataContract]
public class Node : ISerializable
{
[DataMember]
public string Name { get; private set; }
[DataMember]
public List<Edge> Adj { get; private set; }
[DataMember]
public Node Prev { get; set; }
[DataMember]
public double Distance { get; set; }
[Serializable, DataContract]
public class Edge : IComparable, ISerializable
{
[DataMember]
public Node Destination { get; private set; }
[DataMember]
public double Cost { get; set; }
[DataMember]
public double Time { get; set; }
}
[Serializable, DataContract]
public class Tuple<T, T1, T2> : ISerializable
{
[DataMember]
public T Item1 { get; set; }
[DataMember]
public T1 Item2 { get; set; }
[DataMember]
public T2 Item3 { get; set; }
}
}

我已经尝试了一整天,将其序列化为 JSON 或 XML,因为我必须将对象发送到网络服务。

更新:使用 DataContractJsonSerialiser 代替。我收到以下错误:

Object graph for type 'GraphClass.Edge' contains cycles and cannot be serialized if reference tracking is disabled.

正如您在 Node 类中看到的,一个 Node 可以包含一个边列表。不过,我对修复错误一头雾水。

最佳答案

您可能打算使用 DataContractJsonSerializer 吗?这更面向数据契约(Contract); JavascriptSerializer 并不真正关心数据协定完全 - 它只查看类型元。

Graph 只有私有(private)字段; JavascriptSerializer 只查看公共(public)成员。为 nodeMap 添加一个公共(public)属性,也许?

请注意,[Serializable] 在这里什么都不做,并且那些类型实现ISerializable 等,尽管他们声称这样做。


编辑:确认以下似乎工作正常:

DataContractJsonSerializer ser = new DataContractJsonSerializer(graph.GetType());
string s;
using(var ms = new MemoryStream()) {
ser.WriteObject(ms, graph);
s = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
}
Console.WriteLine(s);

添加属性后,以下内容似乎有效:

public Dictionary<string, Node> NodeMap { get { return nodeMap; } }
...
JavaScriptSerializer ser = new JavaScriptSerializer();
string s = ser.Serialize(graph);
Console.WriteLine(s);

关于c# - 无法在自定义类上调用 JavascriptSerialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4304394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com