我一直在使用protobuf-net(版本2.0.0.480)來序列化消息的系統。此應用程序使用CQRS方法,其中命令和事件已被分離到不同的名稱空間[和程序集]中。使用Protobuf-net跨多個命名空間進行序列化
代碼將在運行時爲任何繼承自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);
}
}
幾個類型是手動添加到默認RuntimeTypeModel還有:
RuntimeTypeModel.Default.Add(typeof(ReferenceNumber), true)
.AddSubType(100, typeof(Product))
.AddSubType(110, typeof(ProductGroup));
上述所有似乎正常工作時,所有的消息均:這是使用下面的代碼完成
LogicalGrouping.Events
項目FORW移動ARD和一個新的命名空間添加:
ReferenceGrouping.Commands
一旦ReferenceGrouping.Commands加入並嘗試發送消息的ProtoException被拋出。我發現此行爲的唯一解決方法是將ReferenceGrouping.Commands中的命令添加到LogicalGrouping.Events。
這是預期的行爲還是應該RuntimeTypeModel能夠支持從完全不同的命名空間添加的類?
只要您沒有使用「DynamicType」選項,protobuf-net不會關心名稱空間* *;數據存儲中沒有類型名稱,程序集名稱或字段名稱。 ProtoException中的完整信息是什麼? – 2012-01-30 17:42:21
啊...我想知道... 2秒 – 2012-01-30 17:43:38