2011-05-25 26 views
3

我仍在玩最新發布的protobuf-net版本,而且我遇到了一個我不明白的問題。在序列化圖形時出現異常

讓我們考慮一塊下面的代碼:

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

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

     [ProtoMember(2, IsRequired = true, AsReference = true)] 
     public List<Node> Children { get; set; } 

     public void AddChild(Node child) 
     { 
      Children.Add(child); 
     } 
    } 

    static void Main() 
    { 
     Node n = new Node {Data = 0}, root = n; 
     for (int i=1; i<15; i++) 
     { 
      Node child = new Node {Data = i}; 
      n.AddChild(child); 
      n = child; 
     } 
     Node clone = Serializer.DeepClone(root); 
    } 

它拋出消息類型ProtoException的異常「檢測到可能的遞歸...」

有趣的是,如果我刪除屬性AsReferenceChildren屬性它不!不幸的是,上面的這些行只是爲了說明問題而寫的,我需要這個屬性來表示我正在使用的真實結構。

所以我的問題是...這是一個已知的問題,是否有任何補丁計劃很快解決它?或者是否有人知道任何解決方法?

感謝

+0

令人討厭......我會稍後看 – 2011-05-25 16:52:55

+0

我已經推動了代碼修復;我計劃很快重新發布dll# – 2011-05-25 21:12:40

回答

3

這簡直是一個bug(感謝你如此徹底地行使公測!) - 在動態/參考處理是重複計算的對象(一次作爲墊片包裝的一部分它欺騙到做魔術,一次爲對象本身)。

爲了提高效率,遞歸檢測只能在超出特定深度的情況下全速啓動。你的代碼跳過了這個深度,導致重複計數被視爲遞歸。我已經在代碼中解決了這個問題。上面的代碼通過本地,並將在下一個下降。

+0

是啊!非常感謝!我打算下載並編譯源代碼以繼續討論新版本:) – PierrOz 2011-05-26 06:24:55

+0

@PierrOz - 我昨晚部署了dll ... – 2011-05-26 06:42:25

+0

下載和編譯的源代碼:我確認我的bug已修復!再次感謝你編輯:啊對不起,我沒有刷新我的屏幕,看到你評論:P – PierrOz 2011-05-26 09:27:29