我有一个图形对象,我需要序列化。 Nomatter我实现了哪些成员,该方法返回{}
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,因为我必须将对象发送到Web服务。
更新
使用DataContractJsonSerialiser
代替。我收到以下错误:
Object graph for type 'GraphClass.Edge' contains cycles and cannot be serialized if reference tracking is disabled.
正如您在Node类中看到的,Node可以包含边列表。我虽然无法修复错误。
答案 0 :(得分:4)
您是否打算使用DataContractJsonSerializer
?这是以数据合同为导向的; JavascriptSerializer
并不真正关心关于数据合同的所有 - 它只是关注类型元。
Graph
只有私人字段; JavascriptSerializer
只关注公众成员。为nodeMap
添加公共属性,或许?
请注意,[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);
答案 1 :(得分:0)
我相信马克就在这里。 JavaScriptSerializer根据对象的公共属性创建Json图形;其中Graph类没有。要使用DataContract功能,您需要DataContractJsonSerializer。