2017-08-23 31 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