2017-04-14 75 views
-4

我正在使用Mass Transit發送消息。JSon異常自引用循環

public class Node 
{ 
    public Node Parent; 
    public string Name; 
    public List<Node> Nodes = new List<Node>(); 
} 

public class Portfolio : MessageBase 
{ 
    public string Name; 
    public List<Node> Nodes = new List<Node>(); 
} 
public class TreeUpdateRequest:MessageBase 
{ 
    // just request 
} 

public class TreeUpdateResponse : MessageBase 
{ 
    public Portfolio Portfolios; 
} 

我在發送樹結構。

public async Task Consume(ConsumeContext<TreeRequest> context) 
     { 

// build tree 

      context.Respond(TreeResponse); 
     } 

我有例外。

MassTransit.RabbitMqTransport.Transport.RabbitMqSendTransport Error: 0 : Send Fault: rabbitmq://vip-mnapptst-01/Dimon/bus-ZHUKOV16-MangoAppService.vshost-dyuyyynjq3sxywr8bdkegdq5fc?durable=false&autodelete=true, System.Runtime.Serialization.SerializationException: Failed to serialize message ---> Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'parent' with type 'Open.Mango.Messages.Orc.Node'. Path 'message.portfolios.nodes[14]'. 
    at er jsonWriter, Object value, Type objectType) 
    at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType) 
    at MassTransit.Serialization.JsonMessageSerializer.Serialize[T](Stream stream, SendContext`1 context) 

我嘗試檢查一個樹節點引用本身

a->a

但實際的數據沒有這些

我覺得有在圖形部分的環像

a-> a1 - > .. an-> a 有什麼建議嗎?

+0

父母正在引用孩子,孩子正在引用其父母。這是一個循環,不能被json序列化。 –

+0

我投票結束,因爲您的問題沒有包含足夠的信息來使其具有可重複性。如果您發佈導致序列化異常的數據(或其中的一部分),您不認爲這會有所幫助嗎?否則,它只是你的詞(「但實際的數據沒有[循環]」)與你使用的庫(異常消息),並且這些庫可能最終是正確的。 – stakx

+0

我不理解downvote的人。只需關閉頁面。爲什麼要破壞其他的聲譽? –

回答

3

這絕對是一個循環。您可以通過以下方式複製:

var parent = new Node(); 
parent.Parent = parent; 
var failsHere= Newtonsoft.Json.JsonConvert.SerializeObject(parent); 

您可以告訴Newtonsoft忽略循環處理。不確定RabbitMq是否可以輸入JsonSetting對象,但是可以將全局Json設置定義爲默認設置,並告訴它在RabbitMq調用之前忽略循環處理。

Newtonsoft.Json.JsonConvert.DefaultSettings =() => 
    new Newtonsoft.Json.JsonSerializerSettings() 
    { 
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
    }; 
+1

只是一個註釋,無視它可能不是最好的行動方式,因爲它會改變數據。 JSON.Net可以很好地對引用進行序列化,如果將它配置爲這樣,並且以相同的方式進行反序列化。 –

+0

爲我工作,但仍然需要更多 –