我已经能够在没有问题的情况下序列化可空双打,并且可以序列化可以为空的其他类型的列表,但不能序列化可空双打列表。
如果我这样做:
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行
这应该有用吗?我做错了吗?
答案 0 :(得分:2)
这里的主要问题是protobuf规范根本没有null概念 - 显式null / missing值不能用protobuf格式表示。
在每个库的基础上,库本身可以选择欺骗一个额外的层来允许这种事情,但是:
它应该可能检测到null并且表现得更好!
我建议您序列化拥有可空值的内容列表,而不是自己的null值列表。例如:
[ProtoContract]
public class Foo {
[ProtoMember(1)] public double? Value {get;set;}
}
以上的列表可以表示空值。并且基本上与我写的内容完全相同,如果我添加内置支持欺骗空值。