[英]Json.net: Serialisation/Deserialisation not working for ISerializable object that has circular reference
[英]ISerializable Circular Reference
我一直在嘗試了解如何使用ISerializable接口正確實現循環引用。 但是我什至無法以簡單的形式解決問題,我已經在這里閱讀了說明
但是我無法實現它,我也嘗試過尋找一個沒有用的例子。 我已經檢查了MSDN上的文檔,但是無法使用循環引用來引用任何有關如何處理自定義序列化的引用。
我一直在嘗試的最簡單形式是雙向鏈接列表。
序列化循環引用只需要一種策略即可序列化整個對象圖。 對於雙鏈接列表,您可以從第一個節點開始,然后序列化下一個,(先前的序列已被序列化,因此無需執行任何操作),然后當您想再次構建列表時,只需依次為每個節點設置前一個節點即可(遞歸)這樣的事情
public class LinkList : ISerializable
{
public Node First { get; set; }
public Node Tail { get; set; }
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Firts", First);
}
public LinkList(SerializationInfo info, StreamingContext context)
{
First = info.GetValue("First", typeof(Node)) as Node;
First.PrevNode = null;
//do one one while set the Tail of this class and LinkList proeprty for each node
}
}
public class Node : ISerializable
{
public LinkList LinkList { get; set; }
public Node(SerializationInfo info, StreamingContext context)
{
Name = info.GetString("Name");
NextNode = info.GetValue("NextNode", typeof(Node)) as Node;
if(NextNode != null)
NextNode.PrevNode = this;
}
public Node PrevNode
{
get;
set;
}
public Node NextNode
{
get;
set;
}
public string Name
{
get;
set;
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Next", NextNode);
}
}
一種可行的選擇是在類中添加一個ID字段。 創建一個將與字段ID綁定的整數鏈接列表,並創建一個只讀鏈接列表屬性,該屬性將基於在鏈接列表中找到對ID的引用而被填充。
對此的一個約束是ID列表中的每個對象在反序列化時都必須可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.