如何使用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知道这个呢?
答案 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)
根据Marc post(Protobuf.NET的作者)object
是有问题的。虽然我现在找不到它,但我清楚地记得在源代码中检查object
,以便针对直接序列化对象属性的尝试抛出异常。
要解决此问题,您应该使用更具体的类进行序列化,而不是直接使用object
。您可以使用IProtoSerializer
来实现自定义序列化/反序列化。如果有帮助,Protobuf还将支持ISerializable
和IXmlSerializable
接口。