2017-08-23 12 views
1

RabbitMQにメッセージを送信するとき、どういうふうに、以下のような余分なオブジェクトデータ、主に$タイプを追加しているのでしょうか。Rebus RabbitMQオブジェクトのシリアル化

{"$type":"ThreeSquared.VTGPAM.Objects.Wagon, ThreeSquared.VTGPAM.Objects","WagonId":"a98a06ab-33b9-4a11-9de2-df0b8787b713","WamosId":12324,"Description":"test","YearBuilt":1982,"Token":"3cce443c-249f-4fd2-9882-5830fb308b6b"} 

私たちには、Java RabbitMQライブラリーを再使用なしで使用するクライアントがあります。このアプローチでは、タイプ宣言なしでJSONを送信すると考えています。したがって、単純なJSONオブジェクトで試してみると、これは機能しません。メッセージに$型を定義しないようにするには、どうすればいいのですか?

+1

何が動作しないのですか?追加フィールドはそれらに影響しませんか? – dsolimano

答えて

2

RebusはデフォルトでNewtonsoft JSON.NETをTypeNameHandling.Allで使用しています。つまり、$typeフィールドは、シリアル化された型の完全な.NET型名を含むすべての直列化オブジェクトに含まれています。

メリットは、(おそらく抽象的な)スーパータイプによって参照されるインスタンスを含む可能性がありますが、インタフェースによってもほとんどの場合、シリアル化できる点です。

など。このコマンドメッセージタイプ

は、IFileProcessingTaskの任意の実装を含むことができます。限り、受信者が$typeフィールドの値を経由して、それをルックアップすることによってタイプを見つけることができるよう

public class GZipFileProcessingTask : IFileProcessingTask 
{ 
    // ...  
} 

のようなもの。

このタイプのメッセージを別のプラットフォームで処理したい場合は、すべてのオブジェクトの$typeフィールドを無視するだけです。これは、JSONシリアライザの柔軟性に応じて、簡単/困難/不可能になる場合があります。

public static class RebusConfigEx 
{ 
    public static void UseCustomJsonSerialization(this StandardConfigurer<ISerializer> configurer) 
    { 
     configurer.Register(c => new YourCustomJsonSerializer()); 
    } 
} 

、その後、そこにすべて:

別のオプションは、単にUseCustomJsonSerializationは、あなたがこのように実装する拡張メソッドであるこの

Configure.With(...) 
    .(...) 
    .Serialization(s => s.UseCustomJsonSerialization()) 
    .Start(); 

を行うことによって、独自の実装でREBUS'シリアライザを交換することですISerializerの実装としてクラスYourCustomJsonSerializerを作成することです。

+0

ブリリアント、おかげで情報 – Andrew

+0

ため私は、これは、それを除去するために添加 '.Serialization(X => x.UseNewtonsoftJson(新しいJsonSerializerSettings {TypeNameHandling = TypeNameHandling.None }))' – Andrew

関連する問題