protobuf-net能否正确存储对空容器的有效引用?
本文关键字:有效 引用 存储 protobuf-net | 更新日期: 2023-09-27 18:17:56
给定以下代码:
class Data
{
public List<int> numbers = new List<int>();
}
, 变型。UseConstructor设置为false(为了避免创建空构造函数),我想找到一种方法来实际存储空容器。我知道,如果列表至少有一个项目,protobuf-net将正确序列化/反序列化,但如果列表是空的,我在反序列化时得到一个空引用。当然,这可以通过使用构造函数来解决,但是在将protobuf-net集成到一个大型代码库时,必须为每个类创建一个空的构造函数是非常困难的,并且对于具有全可选参数的构造函数会产生歧义。
protobuf-net可以正确存储对空容器的有效引用吗?
protobuf wire格式没有容器的概念;只是元素。所以在data方面,没有任何东西可以做这个。
从构造函数的讨论中,我猜测您已经启用了跳过构造函数,例如:[ProtoContract(SkipConstructor=true)]
在这种情况下,确实:字段初始化器将不会被调用,并且protobuf-net将不会初始化它在数据中没有看到的字段。所以在空列表的情况下,是的,它会产生一个null
。这实际上不会在反序列化期间导致任何错误,因为protobuf-net 将初始化列表,如果它需要触摸它-但是,是的,我可以理解一些其他代码可以触摸该字段。
添加无参数构造函数并删除SkipConstructor
将允许现有的字段初始化器运行;例如:
[Obsolete("For serialization purposes only")]
private void Data() {}
另一个选择是使用反序列化回调,即
[ProtoBeforeDeserialize]
private void Init() {
numbers = new List<int>();
}
尽管这个增加了的工作(我们现在需要记住所有带有字段初始化项的字段)