【发布时间】:2012-01-30 17:36:11
【问题描述】:
我一直在使用 protobuf-net(版本 2.0.0.480)来序列化消息的系统上工作。此应用程序使用 CQRS 方法,其中命令和事件已分离到不同的命名空间 [和程序集]。
代码将在运行时为从 MessageBase 继承的任何类动态添加类型。这是使用以下代码完成的:
// Used as a unique reference for each type in a member
private static int _sequence = 1000;
public static void RegisterAll()
{
RegisterAllDerivedFrom<MessageBase>();
}
public static void RegisterAllDerivedFrom<T>(params Assembly[] assemblies)
{
if (assemblies == null || assemblies.Length == 0)
{
assemblies = AppDomain.CurrentDomain.GetAssemblies();
}
var type = typeof(T);
var model = RuntimeTypeModel.Default;
var metaModel = model.Add(type, true);
RegisterAllBaseTypes(type, metaModel, model, assemblies);
}
private static void RegisterAllBaseTypes(Type type, MetaType metaModel, RuntimeTypeModel model, params Assembly[] assemblies)
{
foreach (var t in assemblies.SelectMany(a => a.GetTypes().Where(t => t.BaseType != null && t.BaseType == type)))
{
var subModel = model.Add(t, true);
metaModel.AddSubType(_sequence, t);
_sequence++;
RegisterAllBaseTypes(t, subModel, model, assemblies);
}
}
一些类型也手动添加到 Default RuntimeTypeModel:
RuntimeTypeModel.Default.Add(typeof(ReferenceNumber), true)
.AddSubType(100, typeof(Product))
.AddSubType(110, typeof(ProductGroup));
当所有消息都在时,以上所有内容似乎都可以正常工作:
LogicalGrouping.Events
项目向前推进并添加了一个新的命名空间:
ReferenceGrouping.Commands
一旦添加 ReferenceGrouping.Commands 并尝试发送消息,就会抛出 ProtoException。我发现此行为的唯一解决方法是将 ReferenceGrouping.Commands 中的命令添加到 LogicalGrouping.Events。
这是预期的行为还是 RuntimeTypeModel 应该能够支持从完全不同的命名空间添加的类?
【问题讨论】:
-
只要您不使用“DynamicType”选项,protobuf-net 就不会关心命名空间根本;存储的数据中没有类型名称、程序集名称或字段名称。 ProtoException 中的完整信息是什么?
-
啊...我想知道... 2秒
标签: c# serialization protobuf-net cqrs