是否可以使用协议缓冲区序列化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?
检查这些以了解为什么这是一种方法:
-
需要无参数构造函数
-
为什么动态而不是对象不起作用
-
为什么
DynamicType=true
不起作用 -
protobuf-net的创建者需要一个抽象的基类和具体的实现
-
为什么没有对象的序列化器
抽象基础
[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);