Не могу вызвать JavascriptSerialize для пользовательского класса - PullRequest
1 голос
/ 29 ноября 2010

У меня есть графовый объект, который мне нужно сериализовать.Нематериально, какие члены я реализую, метод возвращает {}

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, узел может содержать список ребер.Хотя я не могу исправить ошибку.

Ответы [ 2 ]

4 голосов
/ 29 ноября 2010

Возможно, вы намеревались использовать DataContractJsonSerializer?Это больше ориентировано на данные контракта;JavascriptSerializer на самом деле все равно о контрактах данных - он просто смотрит на тип meta.

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);
0 голосов
/ 29 ноября 2010

Я верю, что Марк точно здесь. JavaScriptSerializer создает Json-графики на основе открытых свойств объекта; из которых ваш класс Graph не имеет ни одного. Для использования функций DataContract необходим DataContractJsonSerializer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...