版本: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的扩展方法。我在this question找到了它。
答案 0 :(得分:1)
哇,我甚至没想到XElement
完全 - 我想这是找到.ToString()
/ .Parse()
对,并使用那些。
这不是protobuf-net目标的用例。我肯定不会指望它保留数据中表示的直接叶/节点之外的数据(这基本上意味着它必须序列化整个XDocument
/每当它看到任何元素时 - 通过.Document
属性。
存储绝对xpath的解决方法是合理的; 非常与存储XElement
不同。
答案 1 :(得分:0)
获取XmlNode关系信息的方式更新为post。虽然它给出了一个好的结果,但它有点慢。