Десериализованный XElement protobuf-net возвращает ноль в качестве NextNode

Версия: protobuf-net r282

Сериализация объекта XElement и десериализация его приведет к потере информации о взаимоотношениях, такой как NextNode, Parent... Похоже, что в нем хранятся только данные Xml.

Есть ли способ хранить информацию об отношениях?

Спасибо!

Вот класс, который я использовал для тестирования:

[ProtoContract]
public class Person
{
    [ProtoMember(1)]
    public string FirstName { get; set; }
    [ProtoMember(2)]
    public string FamilyName { get; set; }
    [ProtoMember(3)]
    public int Age { get; set; }
    [ProtoMember(4)]
    public XDocument Details { get; set; }
    [ProtoMember(5)]
    public XElement Business { get; set; }

    // ctor
    public Person() { } // ctor for Deserialize
    public Person(string first, string family, int age, XDocument details)
    {
        FirstName = first;
        FamilyName = family;
        Age = age;
        Details = details;
        Business = Details == null ? null : Details.Descendants("business").FirstOrDefault();
    }

    // calculated properties
    public string FullName { get { return FirstName + " " + FamilyName; } }

    // Methods
    public string GetDetails(string key)
    {
        if (this.Details == null) return null;

        var found = (from n in Details.Descendants(key)
                     select n.Value).FirstOrDefault();

        return found;
    }
}

[Обновить]

Одним из способов избежать этой проблемы является сериализация абсолютного пути к элементу xelement вместо самого себя. Вот образец.

using System.Xml.XPath;

.....

    //[ProtoMember(5)]
    public XElement Business { get; set; }
    [ProtoMember(5)]
    public string BusinessSerialized
    {
        get { return Business == null ? null : Business.GetAbsoluteXPath(); }
        set
        {
            if (value == null) { Business = null; }
            else
            {
                Business = Details.XPathSelectElements(value).FirstOrDefault();
            }
        }
    }

GetAbsoluteXPath - это метод расширения для XElement. Я нашел это в этом вопросе.

2 ответа

Решение

Способ получения информации о взаимоотношениях XmlNode обновляется для публикации. Хотя он дает хороший результат, он немного медленный.

Вау, я бы даже не ожидал, что XElement работал на всех - я думаю, что это найти .ToString() / .Parse() пара, и с помощью тех.

Это просто не тот случай использования, на который нацелен протокол protobuf-net. И я, конечно, не ожидал бы, что он сохранит данные за пределами непосредственного листа / узла, который представлен в данных (это в основном означало бы, что он должен был сериализовать весь XDocument / независимо от того, каждый раз, когда он увидел какой-либо элемент - через .Document имущество.

Ваш обходной путь с сохранением абсолютного пути xpath является разумным; это очень отличается от хранения XElement,

Другие вопросы по тегам