2017-04-14 11 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

を参照しているかどうかを確認しようとしていた。しかし、実際のデータは、これらの

を持っていない私は、いくつかのループがグラフにあると思いますlike

a-> a1-> .. an-> a 提案がありますか?

+0

親は子を参照しており、子はその親を参照しています。これはループであり、jsonのシリアル化はできません。 –

+0

あなたの質問にこれを再現可能にするのに十分な情報が含まれていないので、私は投票に参加しました。シリアライゼーション例外の原因となるデータ(またはその一部)を投稿した場合に役立つとは思いませんか?さもなければあなたの言葉(「実際のデータにはループはありません」)とあなたが使用したライブラリ(例外メッセージ)とを比較すると、ライブラリはおそらく正しく終わるでしょう。 – stakx

+0

私はダウンボートを理解している人を理解しています。ページを閉じるだけです。なぜ他人の評判を台無しにするのか? –

答えて

3

これは間違いなくループです。次の方法で再現できます。

ループ処理を無視するようにNewtonsoftに指示できます。 RabbitMqがJsonSettingオブジェクトを入力できるかどうかは不明ですが、グローバルJson設定をデフォルトとして定義し、RabbitMq呼び出しの前にループ処理を無視するように指示できます。

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

無視すると、データが変更されるため、操作の最善の方法ではない可能性があります。 JSON.Netは、そのように設定した場合、参照をシリアル化することができ、同じ方法で逆シリアル化します。 –

+0

私のために働きますが、さらに必要があります –