使用 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 使用啥基本序列化器来输出字节数组?