2017-08-23 30 views
1

爲什麼當我通過畫謎,它被添加像下面額外的對象數據,主要是$類型將消息發送到RabbitMQ的。滷麪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庫而沒有rebus。這種方法我相信我們只是發送沒有類型聲明的JSON。因此,當我嘗試閱讀簡單的JSON對象時,這不起作用。我們如何使它工作,以便它不會在消息中定義$類型?

+1

什麼行不通 - 不應該附加字段沒有影響呢?爲信息 – dsolimano

回答

2

這僅僅是因爲Rebus默認使用Newtonsoft JSON.NET和TypeNameHandling.All,這意味着$type字段包含在每個包含序列化類型的完整.NET類型名稱的序列化對象中。

的好處是,你可以序列化幾乎所有的東西,即使它可能包含由(可能是抽象的)超類型引用的情況下,甚至通過接口。

例如該命令消息類型

public class ProcessFile 
{ 
    public ProcessFile(string filePath, IEnumerable<IFileProcessingTask> tasks) 
    { 
     FilePath = filePath; 
     Tasks = tasks; 
    } 

    public string FilePath { get; } 

    public IReadOnlyCollection<IFileProcessingTask> Tasks { get; } 
} 

可以包含的任意IFileProcessingTask實現方式中,例如像

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

只要收件人可以找到類型最多通過$type字段的值看它。

如果你要處理在其他平臺上此類型的消息,你可以簡單地讓它忽略每個對象的$type領域。這可能很容易/很難/不可能,這取決於JSON序列化程序的靈活性。

另一種選擇是通過這樣

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

其中UseCustomJsonSerialization是你實現這樣的擴展方法與自己的實現簡單地更換滷麪串行:

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

,然後都在那裏剩下要做的是創建類YourCustomJsonSerializer作爲ISerializer的實現。

+0

亮,由於這對刪除它 '.Serialization(X => x.UseNewtonsoftJson(新JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None }))' – Andrew

+0

我剛添加 – Andrew