是否可以使用协议缓冲区序列化 System.Object 个对象的列表
Is it possible to serialize a list of System.Object objects using protocol buffers
我有一个各种数据类型(DateTime、int、decimal、string)的对象列表。
List<object> myObjects = new List<object>();
myObjects.Add(3);
myObjects.Add(3.9m);
myObjects.Add(DateTime.Now);
myObjects.Add("HELLO");
我能够使用 protobuf-net 序列化此列表,但反序列化总是抛出异常:"Additional information: Type is not expected, and no contract can be inferred: System.Object".
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, list2);
var bytes = ms.ToArray();
ms.Position = 0;
var clone = Serializer.Deserialize(typeof(List<object>), ms); //Throws exception
}
我没有任何明确的合同,我想这就是问题所在?但是,我确实知道序列化对象的预期类型是什么,但是我该如何告诉 protobuf-net?
检查这些以了解为什么这是一种方法:
The need for a parameterless constructor
why dynamic instead of object wouldn't have worked
为什么DynamicType=true
wouldn't have worked
the need for an abstract base class and concrete implementations,protobuf-net 的创建者
why no serializer for object
抽象基础
[ProtoContract]
[ProtoInclude (1, typeof(ObjectWrapper<int>))]
[ProtoInclude(2, typeof(ObjectWrapper<decimal>))]
[ProtoInclude(3, typeof(ObjectWrapper<DateTime>))]
[ProtoInclude(4, typeof(ObjectWrapper<string>))]
abstract class ObjectWrapper {
protected ObjectWrapper() {}
abstract public object ObjectValue { get; set; }
}
实施
[ProtoContract()]
class ObjectWrapper<T> : 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<ObjectWrapper>();
myObjects.Add(new ObjectWrapper<int>(3));
myObjects.Add(new ObjectWrapper<decimal>(3.9m));
myObjects.Add(new ObjectWrapper<DateTime> (DateTime.Now));
myObjects.Add(new ObjectWrapper<string> ("HELLO"));
var clone = Serializer.DeepClone(myObjects);
我有一个各种数据类型(DateTime、int、decimal、string)的对象列表。
List<object> myObjects = new List<object>();
myObjects.Add(3);
myObjects.Add(3.9m);
myObjects.Add(DateTime.Now);
myObjects.Add("HELLO");
我能够使用 protobuf-net 序列化此列表,但反序列化总是抛出异常:"Additional information: Type is not expected, and no contract can be inferred: System.Object".
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, list2);
var bytes = ms.ToArray();
ms.Position = 0;
var clone = Serializer.Deserialize(typeof(List<object>), ms); //Throws exception
}
我没有任何明确的合同,我想这就是问题所在?但是,我确实知道序列化对象的预期类型是什么,但是我该如何告诉 protobuf-net?
检查这些以了解为什么这是一种方法:
The need for a parameterless constructor
why dynamic instead of object wouldn't have worked
为什么
DynamicType=true
wouldn't have workedthe need for an abstract base class and concrete implementations,protobuf-net 的创建者
why no serializer for object
抽象基础
[ProtoContract]
[ProtoInclude (1, typeof(ObjectWrapper<int>))]
[ProtoInclude(2, typeof(ObjectWrapper<decimal>))]
[ProtoInclude(3, typeof(ObjectWrapper<DateTime>))]
[ProtoInclude(4, typeof(ObjectWrapper<string>))]
abstract class ObjectWrapper {
protected ObjectWrapper() {}
abstract public object ObjectValue { get; set; }
}
实施
[ProtoContract()]
class ObjectWrapper<T> : 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<ObjectWrapper>();
myObjects.Add(new ObjectWrapper<int>(3));
myObjects.Add(new ObjectWrapper<decimal>(3.9m));
myObjects.Add(new ObjectWrapper<DateTime> (DateTime.Now));
myObjects.Add(new ObjectWrapper<string> ("HELLO"));
var clone = Serializer.DeepClone(myObjects);