是否可以使用协议缓冲区序列化System.Object对象列表

我有各种数据类型的对象列表(DateTime,int,decimal,string)。

List myObjects = new List(); myObjects.Add(3); myObjects.Add(3.9m); myObjects.Add(DateTime.Now); myObjects.Add("HELLO"); 

我能够使用protobuf-net序列化此列表,但反序列化总是抛出exception:“附加信息:不期望类型,也不能推断出合同:System.Object”。

 using (var ms = new MemoryStream()) { Serializer.Serialize(ms, list2); var bytes = ms.ToArray(); ms.Position = 0; var clone = Serializer.Deserialize(typeof(List), ms); //Throws exception } 

我没有任何明确的合同,我想这是问题所在? 但是,我确实知道序列化对象的预期类型是什么,但我如何告诉protobuf-net?

检查这些以了解为什么这是一种方法:

  1. 需要无参数构造函数

  2. 为什么动态而不是对象不起作用

  3. 为什么DynamicType=true 不起作用

  4. protobuf-net的创建者需要一个抽象的基类和具体的实现

  5. 为什么没有对象的序列化器

抽象基础

  [ProtoContract] [ProtoInclude (1, typeof(ObjectWrapper))] [ProtoInclude(2, typeof(ObjectWrapper))] [ProtoInclude(3, typeof(ObjectWrapper))] [ProtoInclude(4, typeof(ObjectWrapper))] abstract class ObjectWrapper { protected ObjectWrapper() {} abstract public object ObjectValue { get; set; } } 

履行

  [ProtoContract()] class ObjectWrapper : ObjectWrapper { public ObjectWrapper(): base() { } public ObjectWrapper(T t) { this.Value = t; } [ProtoIgnore()] public override object ObjectValue { get { return Value; } set { Value = (T)value; } } [ProtoMember(1)] public T Value { get; set; } } 

测试

  var myObjects = new List(); myObjects.Add(new ObjectWrapper(3)); myObjects.Add(new ObjectWrapper(3.9m)); myObjects.Add(new ObjectWrapper (DateTime.Now)); myObjects.Add(new ObjectWrapper ("HELLO")); var clone = Serializer.DeepClone(myObjects);