2011-05-23 61 views
1

,同时与新发布的protobuf.net打,我们遇到下面的代码说明问题:问题序列化图形与protobuf.net

[ProtoContract] 
class Node 
{ 
    public Node() 
    { 
     ChildLinks = new List<Link>(); 
     ParentLinks = new List<Link>(); 
    } 

    [ProtoMember(1, IsRequired = true)] 
    public string Data { get; set; } 

    [ProtoMember(2, IsRequired = true)] 
    public List<Link> ChildLinks { get; set; } 

    [ProtoMember(3, IsRequired = true)] 
    public List<Link> ParentLinks { get; set; } 

    public void AddChild(Node child) 
    { 
     Link link = new Link { Parent = this, Child = child }; 
     ChildLinks.Add(link); 
     child.ParentLinks.Add(link); 
    } 
} 

[ProtoContract] 
class Link 
{ 
    [ProtoMember(2, AsReference = true, IsRequired = true)] 
    public Node Child { get; set; } 

    [ProtoMember(3, AsReference = true, IsRequired = true)] 
    public Node Parent { get; set; } 
} 

public static void Main() 
{ 
    Node node = new Node { Data = "parent" }; 
    node.AddChild(new Node { Data = "child" }); 

    using (MemoryStream memStream = new MemoryStream()) 
    { 
     Serializer.Serialize(memStream, node); 
     memStream.Position = 0; 
     Node deserialized = Serializer.Deserialize<Node>(memStream); 

     Link childLink = deserialized.ChildLinks.Single(); 
     Debug.Assert(ReferenceEquals(childLink, childLink.Child.ParentLinks.Single())); 
    } 
} 

断言抛出一个异常...我们的目标在这里是在ChildLinks和ParentLinks属性中有一个Link对象的唯一实例。我们尝试了AsReference属性,但它不起作用...

有没有人知道我们如何解决这个问题?

+0

您好侧步此;目前我陷入了一些可怕的错误。几乎无法阅读/思考。一旦我身体健康,我会尽快查看。 – 2011-05-23 17:44:15

+0

(要清楚 - 这里的“错误”,我的意思是“疾病”,而不是“软件问题”) – 2011-05-23 18:04:20

+0

清除液体和休息,先生。最后,我可以帮助Marc的问题:) – user7116 2011-05-23 18:56:32

回答

1

我仍然需要评估影响(而不是干什么,而我的头感觉像奶酪),但有一个....图中的对象的故障点 - 意思是:因为我通常处理参考跟踪,而行走协会,并在根对象没有关联。我想我可以用一些类型级属性来解决这个问题(即总是作为参考)。

无论如何,现在可以通过添加多一个水平的曲线图(人工添加的关联),即

static class Program 
{ 
    public static void Main() 
    { 

     Node node = new Node { Data = "parent" }; 
     node.AddChild(new Node { Data = "child" }); 
     using (MemoryStream memStream = new MemoryStream()) 
     { 
      Serializer.Serialize(memStream, new NodeWrapper { Root = node }); 
      memStream.Position = 0; 
      Node deserialized = Serializer.Deserialize<NodeWrapper>(memStream).Root; 

      Link childLink = deserialized.ChildLinks.Single(); 
      Debug.Assert(ReferenceEquals(childLink, childLink.Child.ParentLinks.Single())); 
     } 
    } 
} 
[ProtoContract] 
class NodeWrapper 
{ 
    [ProtoMember(1, AsReference = true, IsRequired = true)] 
    public Node Root {get;set;} 
} 
+0

感谢您的回答。在阅读它并使用新的dll播放更多内容后,围绕此属性“AsReference”的内容变得更加清晰 – PierrOz 2011-05-24 18:16:33

+0

@PierrOz cool;我将继续考虑为此目的修复根对象 – 2011-05-24 18:18:42