protobuf-net反序列化的XElement返回null作为NextNode

时间:2013-09-26 05:37:41

标签: c# protobuf-net xelement

版本: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找到了它。

2 个答案:

答案 0 :(得分:1)

哇,我甚至没想到XElement完全 - 我想这是找到.ToString() / .Parse()对,并使用那些。

这不是protobuf-net目标的用例。我肯定不会指望它保留数据中表示的直接叶/节点之外的数据(这基本上意味着它必须序列化整个XDocument /每当它看到任何元素时 - 通过.Document属性。

存储绝对xpath的解决方法是合理的; 非常与存储XElement不同。

答案 1 :(得分:0)

获取XmlNode关系信息的方式更新为post。虽然它给出了一个好的结果,但它有点慢。