无法在自定义类上调用JavascriptSerialize

时间:2010-11-29 13:54:09

标签: c# json serialization

我有一个图形对象,我需要序列化。 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可以包含边列表。我虽然无法修复错误。

2 个答案:

答案 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。