使用 protobuf-net 序列化数组时如何处理空值?

Posted

技术标签:

【中文标题】使用 protobuf-net 序列化数组时如何处理空值?【英文标题】:How to deal with null values when serializing arrays with protobuf-net? 【发布时间】:2011-09-07 09:45:52 【问题描述】:

以下语句以NullReferenceException 失败:

TypeModel.Create().DeepClone(new string[1]);

检查源代码发现异常是故意抛出的,这意味着数组中的 null 值违反了协议缓冲区规范(有道理,null 不是任何值的重复)。

好的,规范是正确的,但是如果集合中仍然存在空值,我们该怎么办?除了确保没有 null 值进入我们的集合之外,还有其他解决方案吗?

谢谢。

【问题讨论】:

【参考方案1】:

看这个:

http://code.google.com/p/protobuf-net/issues/detail?id=217

相关部分的引用

项目成员 marc.gravell 的评论 4,2011 年 12 月 14 日

我还没有记录该选项(它是作为特定请求添加的),但是 - 目前您只能通过以下方式启用它(例如):

RuntimeTypeModel.Default[typeof (YourType)][3].SupportNull = true;

其中 3 是字段编号。

这应该也可以在属性模型上使用...

注意用户“将” - 我之前回答的删除者 - 我知道这不是最好的地方,但我不知道有其他方式给你发消息,在这种情况下保持安静是错误的:我是对第一次“太短”的答案感到抱歉,但是编辑不会比突然删除更具建设性吗?我提供的链接仍然没有回答问题,评论也证明了这一点......我只是偶然发现你确实删除了它。

【讨论】:

我们可以在 Java 中启用它吗?这也可以在 Java 中的“精简”或“完整”版本的库中使用吗? @metsathya 不幸的是,我没有 Java 方面的 Protobuf 经验,因此无法评论 Java 选项。【参考方案2】:

这是一个棘手的问题;在网络级别,集合只是一个重复的标签——每个元素代表一个对象。很简单,没有办法直接在 protobuf 规范中表达null

现在,我可能会弄脏并为带有 null 的集合添加某种双重标签,但是 - 老实说,我认为通常使用看起来为 null 的非 null 对象会更好(如果你看到我的意思是说)。在字符串的情况下,也许 "" 会做(这取决于上下文,真的)。

我也愿意接受建议,但是...需要牢记规范的限制。

【讨论】:

似乎问题出在任何引用类型上,而不仅仅是字符串。还是只有字符串,因为它是唯一的核心引用类型? @chibacity 不考虑(固定)数据格式 @mark 任何引用类型(list-of/array-of),并且可能为 nullable-of-t(list-of/array-of)

以上是关于使用 protobuf-net 序列化数组时如何处理空值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 protobuf-net 序列化/反序列化锯齿状/嵌套数组?

如何在 Protobuf-Net 中保留一个可为空值的数组?

protobuf-net 使用啥基本序列化器来输出字节数组?

protobuf-net 序列化返回空数组

Protobuf-net:如何调试“不支持嵌套或锯齿状列表和数组”

使用protobuf-net继承时如何选择字段号?