使用Protobuf-net序列化可空双打列表时出现问题

时间:2013-05-26 03:58:55

标签: protobuf-net

我已经能够在没有问题的情况下序列化可空双打,并且可以序列化可以为空的其他类型的列表,但不能序列化可空双打列表。

如果我这样做:

        List<double?> aList = new List<double?>();
        aList.Add(0.1);
        aList.Add(null);
        Serializer.Serialize(ms, aList);

我收到此错误:

  

System.NullReferenceException:未将对象引用设置为对象的实例。      at ProtoBuf.Meta.TypeModel.TrySerializeAuxiliaryType(ProtoWriter writer,Type type,DataFormat format,Int32 tag,Object value,Boolean isInsideList)在c:\ Dev \ protobuf-net \ protobuf-net \ Meta \ TypeModel.cs:第169行      at ProtoBuf.Meta.TypeModel.SerializeCore(ProtoWriter writer,Object value)在c:\ Dev \ protobuf-net \ protobuf-net \ Meta \ TypeModel.cs:第188行      at ProtoBuf.Meta.TypeModel.Serialize(Stream dest,Object value,SerializationContext context)在c:\ Dev \ protobuf-net \ protobuf-net \ Meta \ TypeModel.cs:第217行      at ProtoBuf.Meta.TypeModel.Serialize(Stream dest,Object value)在c:\ Dev \ protobuf-net \ protobuf-net \ Meta \ TypeModel.cs:第201行      at ProtoBuf.Serializer.Serialize [T](Stream destination,T instance)在c:\ Dev \ protobuf-net \ protobuf-net \ Serializer.cs:第87行

这应该有用吗?我做错了吗?

1 个答案:

答案 0 :(得分:2)

这里的主要问题是protobuf规范根本没有null概念 - 显式null / missing值不能用protobuf格式表示。

在每个库的基础上,库本身可以选择欺骗一个额外的层来允许这种事情,但是:

  • 线路上需要额外的字节
  • 会使代码复杂化并需要额外的配置
  • 它会(必要时)禁用像“packed”编码
  • 这样的优化

它应该可能检测到null并且表现得更好!

我建议您序列化拥有可空值的内容列表,而不是自己的null值列表。例如:

[ProtoContract]
public class Foo {
    [ProtoMember(1)] public double? Value {get;set;}
}

以上的列表可以表示空值。并且基本上与我写的内容完全相同,如果我添加内置支持欺骗空值。