4

我已经能够毫无问题地序列化可空双精度数,并且可以序列化可空其他类型的列表,但不能序列化可空双精度数列表。

如果我这样做:

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

我收到此错误:

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

这应该工作吗?难道我做错了什么?

4

1 回答 1

3

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

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

  • 它会在线路上占用额外的字节
  • 它会使代码复杂化并需要额外的配置
  • 它会(必要时)禁用优化,如“打包”编码

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

我鼓励您序列化具有可空值的事物列表,而不是序列化可空值本身的列表。例如:

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

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

于 2013-05-26T07:45:53.103 回答