这仅仅是因为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
的实现。
什么行不通 - 不应该附加字段没有影响呢?为信息 – dsolimano