在Protobuf.NET?</object>中序列化List <object>(对象是支持的基元)

时间:2011-09-21 22:24:04

标签: c# protobuf-net

如何使用protobuf-net序列化这样的对象:

public class MyObject{
   public string Key {get; set;}
   public List<Object> Values {get; set;}
}

当我尝试使用TypeModel序列化它时,protobuf-net会抛出一个错误,指出它不知道如何序列化System.Object。现在我知道Values只会包含基元(int,string,float,DateTime等)。那么我如何让protobuf-net知道这个呢?

2 个答案:

答案 0 :(得分:9)

从纯粹的ProtoBuf来看,这在任何意义上都是不可行的。 ProtoBuf是强类型的,但在消息中不包含类型信息;类型信息始终在外部指定。因此,有两个“好”的解决方案;即,除Protobuf-net之外的protobuf实现很容易解释的解决方案(您可能会或可能不关心,但马克肯定会这样)。

1:将List<object>替换为List<PrimitiveType>,其中PrimitiveType包含与所有12种左右原始类型对应的可选字段(取决于您对“基元类型”的定义。),并确保每个实例中只填写其中一个。

2:将List<object>替换为List<int>List<double>List<string>等。

答案 1 :(得分:0)

请参阅In Protobuf-net how can I pass an array of type object with objects of different types inside, knowing the set of potential types in advance

根据Marc post(Protobuf.NET的作者)object是有问题的。虽然我现在找不到它,但我清楚地记得在源代码中检查object,以便针对直接序列化对象属性的尝试抛出异常。

要解决此问题,您应该使用更具体的类进行序列化,而不是直接使用object。您可以使用IProtoSerializer来实现自定义序列化/反序列化。如果有帮助,Protobuf还将支持ISerializableIXmlSerializable接口。