這僅僅是因爲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