C# Rebus RabbitMQ对象序列化

C# Rebus RabbitMQ对象序列化,c#,rabbitmq,rebus,C#,Rabbitmq,Rebus,为什么当我通过rebus向RabbitMQ发送一条消息,说明它正在添加额外的对象数据,如下面所示,主要是$type {"$type":"ThreeSquared.VTGPAM.Objects.Wagon, ThreeSquared.VTGPAM.Objects","WagonId":"a98a06ab-33b9-4a11-9de2-df0b8787b713","WamosId":12324,"Description":"test","YearBuilt":1982,"Token":"3cce44

为什么当我通过rebus向RabbitMQ发送一条消息,说明它正在添加额外的对象数据,如下面所示,主要是$type

{"$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对象时,这不起作用。我们如何使其工作,使其不在消息中定义$type?

这只是因为Rebus在默认情况下使用Newtonsoft JSON.NET with,这意味着
$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; }
}
只要收件人可以通过
$type
字段的值查找类型,就可以找到该类型

如果您想在另一个平台上处理此类消息,只需使其忽略每个对象的
$type
字段即可。这可能容易/难/不可能,取决于JSON序列化程序的灵活性

另一种选择是通过这样做,简单地用您自己的实现替换Rebus的序列化程序

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());
    }
}
公共静态类重新配置
{
公共静态无效UseCustomJsonSerialization(此标准配置器配置器)
{
Register(c=>newyourcustomjsonserializer());
}
}

然后剩下要做的就是创建类
YourCustomJsonSerializer
作为的实现。

什么不起作用-附加字段不应该影响它们吗?我只是添加了这个来删除它
。序列化(x=>x.UseNewtonsoftJson(新的JsonSerializerSettings{typenameholding=typenameholding.None}))
public static class RebusConfigEx
{
    public static void UseCustomJsonSerialization(this StandardConfigurer<ISerializer> configurer)
    {
        configurer.Register(c => new YourCustomJsonSerializer());
    }
}