Десериализованный 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
,