【发布时间】:2017-03-23 02:43:38
【问题描述】:
public MyType {
[ProtoMember(1)]
public int Index;
[ProtoMember(2)]
public string Name;
public MyType() {
}
public MyType(int index, string name) {
Index = index;
Name = name;
}
}
var element0 = new MyType(0,"element index 0");
var element1 = null;
var element2 = new MyType(2,"element index 2");
var list = new List<MyType> {element0, element1, element2}
由于元素索引 1 为 null ,protobuf-net 序列化程序将从序列化字节中省略该元素。
在电线的另一边,发生了一件非常有趣的事情:
protobuf-net 解串器读取字节,得知预期有 3 个元素,但只找到元素索引 0 和 2 的字节。因此它将元素索引 1 创建为 MyType 的空实例。
所以反序列化的列表等价于:
var element0 = new MyType(0,"element index 0");
var element1 = new MyType(0,null);
var element2 = new MyType(2,"element index 2");
var list = new List<MyType> {element0, element1, element2}
但这不是预期的。 Null 与空对象不同,具有重复 Index=0 和 Name=null 的元素的存在可能会对处理代码产生严重的不利后果 - 理所当然不应意识到也不关心 serdes 细节。
有解决方法吗?
【问题讨论】:
标签: list serialization null deserialization protobuf-net