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为空,protobuf-net
序列化程序将忽略序列化字节中的该元素。
在另一端,发生了非常有趣的事情:
protobuf-net
反序列化程序读取字节,得知应该有3个元素,但只找到了索引0和2的元素字节。因此,它创建了一个空的MyType
实例作为元素索引1。
因此,反序列化的列表等效于:
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元素的存在可能会对处理代码产生严重的不良影响——这些代码理应不知道或关心序列化/反序列化的细节。
有解决方法吗?
RuntimeTypeModel.Default[typeof(YourType)][1].SupportNull = true;
这个方法还被支持吗?如果是,您建议使用它吗?有什么优缺点? - BaltoStarRuntimeTypeModel.Default[typeof(MyType)][1].SupportNull = true;
RuntimeTypeModel.Default[typeof(MyEmbeddedType)][2].SupportNull = true;
RuntimeTypeModel.Default[typeof(MySubType)][3].SupportNull = true;
我会得到零散的空引用错误。奇怪的是,这似乎取决于所选择的协议索引的值和顺序。 - BaltoStar