1

版本: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 的扩展方法。我在这个问题中找到了它。

4

2 回答 2

1

哇,我什至根本没想到它会起作用XElement——我猜它正在找到/对,并使用它们。.ToString().Parse()

这根本不是 protobuf-net 所针对的用例。而且我当然不希望它在数据中表示的直接叶/节点之外保留数据(这基本上意味着它必须在XDocument每次看到任何元素时序列化整个/无论什么 - 通过.Document属性。

您存储绝对 xpath 的解决方法是合理的;这与存储XElement.

于 2013-09-26T07:22:26.577 回答
0

The way to obtain relationship information of XmlNode is updated to post. Though it gives a good result, it's a little bit slow.

于 2013-09-30T01:34:13.997 回答