【问题标题】:Serialize List<object> (where the objects are supported primitives) in Protobuf.NET?在 Protobuf.NET 中序列化 List<object> (对象是支持的原语)?
【发布时间】:2011-11-22 08:59:27
【问题描述】:

如何使用 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 知道这件事呢?

【问题讨论】:

  • 不过,它是可序列化的。
  • 我不知道 protobuf,但你对序列化程序的要求非常高。
  • .NET DataContract 可以很好地序列化它......是的,DateTime 在.NET 中有一种奇怪的半原始状态。例如,int?是有效的和 MyObject?不是,因为 MyObject 不是原始的,但是 DateTime?是完全有效的。所以不,也许不是原语,但它是一个值类型,它是内置的,可序列化的。
  • 请注意,所有structs 都是ValueType,因为int 只是struct System.Int32.... 考虑代码(42).GetType().BaseTypevar v = new List&lt;ValueType&gt;() { 1, Guid.NewGuid() }。但是,即使我觉得它很有趣,这可能根本无法解决手头的问题(它将类型限制为struct,而不是“支持的可序列化类型”):)“问题”是protobuf-net 只知道如何序列化/编码非常有限的类型子集(而 DCS 和 XmlSerializer 更健壮)。
  • 我认为这实际上可能是一个更根本的问题:除非我弄错了,否则协议缓冲区只支持同构列表..?

标签: c# protobuf-net


【解决方案1】:

在任何意义上,这在纯 ProtoBuf 中是不可行的。 ProtoBuf 是强类型的,但消息中不包含类型信息;类型信息始终在外部指定。因此有两个“好”的解决方案;即,通过 Protobuf-net 以外的 protobuf 实现易于解释的解决方案(您可能关心也可能不关心,但 marc 确实似乎关心)。

1:将List&lt;object&gt; 替换为List&lt;PrimitiveType&gt;,其中PrimitiveType 包含对应于所有12 种左右原始类型的可选字段(取决于您对“原始类型”的定义。),并且您确保只有其中一种这些是在每个实例上填写的。

2:将List&lt;object&gt;替换为List&lt;int&gt;List&lt;double&gt;List&lt;string&gt;等的组合。

【讨论】:

    【解决方案2】:

    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 的帖子(Protobuf.NET 的作者)object 是有问题的。虽然我现在找不到它,但我清楚地记得在源代码中看到了对 object 的检查,以针对尝试直接序列化对象属性抛出异常。

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

    【讨论】:

    • 澄清一下:protobuf-net 不是 consume ISerializable 也不是 IXmlSerializable - 而是可以用来实现它们。 IProtoSerializer 是一个internal类,不能单独使用。
    • @MarcGravell 感谢您的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多