在ProtoBuf-net中序列化字典失败

(注意:字典,其中T是一些ProtoContract / ProtoMembered类工作正常。)这个问题只发生在我的类型对象上。

我试图序列化词典工作字典。

typeof(object)不起作用。 应该是? 我应该实现基于字符串的解决方案吗?

在这种情况下,对象将只是一个.net原语。

[Test] public void De_SerializeObjectDictionary2() { var d = new Dictionary(); d.Add("abc", 12); var ms = new MemoryStream(); var model = ProtoBuf.Meta.RuntimeTypeModel.Default; //model.AutoAddMissingTypes = true; //model.AutoCompile = true; //model.InferTagFromNameDefault = true; //model.Add(typeof (object), false); //model.Add(typeof(Int32), true); //model[typeof (object)].AddSubType(50, typeof (Int32)); model.Serialize(ms, d); Serializer.Serialize<Dictionary>(ms, d); // <--- No serializer defined for type: System.Object // or //model.Add(typeof (object), false); //Serializer.Serialize<Dictionary>(ms, d); //<-- Unexpected sub-type: System.Int32 ms.Position = 0; var d2 = Serializer.Deserialize<Dictionary>(ms); } 

我试图提前定义这些类型……但我认为默认情况下它们是由protobuf-net处理的

  //model.Add(typeof (object), false); //model[typeof (object)].AddSubType(50, typeof (Int32)); /* //model.Add(typeof(int), false); //model.Add(typeof(string), false); //model.Add(typeof(short), false); //model.Add(typeof(DateTime), false); //model.Add(typeof(long), false); //model.Add(typeof(bool), false); //model.Add(typeof(int[]), false); //model.Add(typeof(string[]), false); //model.Add(typeof(short[]), false); //model.Add(typeof(DateTime[]), false); //model.Add(typeof(long[]), false); //model.Add(typeof(bool[]), false); //model.Add(typeof(int?), false); //model.Add(typeof(short?), false); //model.Add(typeof(DateTime?), false); //model.Add(typeof(long?), false); //model.Add(typeof(bool?), false); //model.Add(typeof(int?[]), false); //model.Add(typeof(short?[]), false); //model.Add(typeof(DateTime?[]), false); //model.Add(typeof(long?[]), false); //model.Add(typeof(bool?[]), false); //model.Add(typeof(byte[]), false); //model.Add(typeof(byte), false); 

直接执行此操作的愿望已经提出,并且在我的列表中可以查看,但是:使用内置序列化(int等)作为inheritance的一部分来处理类型具有一些不太有趣的技术问题。 我的建议是使用具有通用具体实现的抽象基类,并在基类型上使用“include”属性来引用运行时的每个预期类型FooFoo等.DynamicType也会在这里考虑一下,但没有一些小的调整,我认为这不会立即为字典工作。 但它可以做到。