Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# protobuf net能否正确存储对空容器的有效引用?_C#_Generics_Protocol Buffers_Protobuf Net - Fatal编程技术网

C# protobuf net能否正确存储对空容器的有效引用?

C# protobuf net能否正确存储对空容器的有效引用?,c#,generics,protocol-buffers,protobuf-net,C#,Generics,Protocol Buffers,Protobuf Net,给定以下代码: class Data { public List<int> numbers = new List<int>(); } 类数据 { 公共列表编号=新列表(); } 如果MetaType.UseConstructor设置为false(为了避免创建空构造函数),我想找到一种实际存储空容器的方法。我知道protobuf net将在列表至少有一个项的情况下正确地序列化/反序列化,但是如果列表为空,则在反序列化时我得到一个空引用。当然,它是通过使用构造函数

给定以下代码:

class Data
{
    public List<int> numbers = new List<int>();
}
类数据
{
公共列表编号=新列表();
}
如果MetaType.UseConstructor设置为false(为了避免创建空构造函数),我想找到一种实际存储空容器的方法。我知道protobuf net将在列表至少有一个项的情况下正确地序列化/反序列化,但是如果列表为空,则在反序列化时我得到一个空引用。当然,它是通过使用构造函数来解决的,但是在将protobuf net集成到一个大型代码库时,必须为每个类创建一个空构造函数是非常困难的,并且会为具有所有可选参数的构造函数造成歧义


protobuf net能否正确存储对空容器的有效引用?

protobuf wire格式没有容器的概念;只是元素。因此,就数据而言,没有什么可以做的

从对构造函数的讨论中,我猜您启用了构造函数跳过,例如:

[ProtoContract(SkipConstructor=true)]
[Obsolete("For serialization purposes only")]
private void Data() {}
在这种情况下,事实上:不会调用字段初始值设定项,protobuf net不会初始化它在数据中看不到的字段。因此,在空列表的情况下,是的,它将导致
null
。这实际上不会在反序列化过程中导致任何错误,因为protobuf net将在需要触摸列表时初始化列表-但是是的,我可以理解其他一些代码可能会触摸该字段

添加无参数构造函数并删除
SkipConstructor
将允许运行现有字段初始值设定项;例如:

[ProtoContract(SkipConstructor=true)]
[Obsolete("For serialization purposes only")]
private void Data() {}
另一种选择是使用反序列化回调,即

[ProtoBeforeDeserialize]
private void Init() {
    numbers = new List<int>();
}
[protobefore反序列化]
私有void Init(){
数字=新列表();
}

尽管这增加了工作(我们现在需要记住所有字段的初始值设定项)

使用属性延迟初始化列表怎么样?(在getter中,检查它是否为null,然后构造列表。)您能澄清一下“必须为每个类创建一个空构造函数是非常困难的”吗?你知道,确实有。例如,如果你有200多个类,其中大多数只使用参数构造(预期),你有义务为每个类编写一个新的无参数构造函数,而且,你可能会默默地引入允许创建一个没有正确参数的对象(可能是无效对象)的副作用@cdhowie我正试图找到一个解决方案,在这个解决方案中,代码库和需求的变化最小,这样程序员就不会轻易违反序列化模型。添加到protobuf网络对空泛型容器的支持可行吗?可能通过强制序列化一个特殊的“空”对象来恢复到一个新的空引用?如果我序列化一个空容器并且没有从中生成错误,我希望反序列化过程提供相同的空容器。多个字段引用同一个空容器如何?如果你仔细想想,它并不是那么非典型。它只是一个引用跟踪对象,这听起来很容易,直到你意识到protobuf wire格式没有引用的概念。