protobuf-net 缺少可选字段的has_函数
protobuf-net missing has_ function for optional fields?.
我们使用协议缓冲区在本机C++应用程序之间进行通信,但也通过protobuf-net r666在本机C++应用程序和.NET应用程序(全部为VS2012)之间进行通信。我们C++严重依赖可用于可选元素的has_函数。
例如,如果我们有一条带有字段可选布尔值的消息,则可能是它未设置、设置为 true 或设置为 false。
C++可以使用函数has_field检查这一点,如果设置,则可以使用get_field函数获取内容。如果未设置,并且调用get_field,则 get 返回默认值,如果未显式设置,则为 false(对于布尔值)。
这在C++中非常有效,但是,在 protobuf-net 中,我们似乎找不到 has_ 函数的等效项,并且当收到消息时,该字段被添加到消息中,并且它的内容设置为默认值,为 false。该字段默认存在并不是灾难,但问题是没有has_函数来检查它是否在消息中设置。
请告知这是否是一个错误,或者我们是否在protobuf-net中遗漏了一些东西,这实际上是可能的
提前感谢。维姆
(我知道我们已经在问题跟踪器中介绍了这一点 - 这纯粹是为了可见性等)
这与从.proto文件生成类有关,在protobuf-net的情况下,这是通过protogen工具。默认情况下,它不会创建等效的has_*
方法,但可以使用-p:detectMissing
开关启用此功能 - 这会导致它创建*Specified
访问器。此处的命名是 .NET 惯用语,其他一些 .NET 序列化程序和内部代码*Specified
识别。它还生成一个专用ShouldSerialize*
方法,这再次有助于一些内部 .NET 代码。
在此特定情况下,名为 value
的成员存在导致混淆的次要问题;csharp.xslt
文件现已更新以解决此问题。
更新:在完全托管重写中,使用 proto2
语法(默认值)时默认生成 ShouldSerialize*()
方法。不需要其他参数。不添加*Specified
成员(它对ShouldSerialize*()
没有其他用途。
请注意,使用 proto3
时,序列化规则的更改意味着此概念不再有意义。当且仅当值不是默认值(始终为 null/false/零/空)时,才会序列化该值。没有"默认值但指定"的概念。因此,ShouldSerialize*()
方法通常不再有用,并且不会生成。我愿意让它们为proto3
选择性地生成,它们基本上意味着"非默认",如果这有助于一些真正的编码场景。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- C++14 类函数错误:"Object has no attribute 'value'"
- "has-a"点类成员数据的矩形类。使用 Point 类的成员函数时,成员数据不会更新
- C++设计:自定义字符串类的基类构造函数和is-a或has-a关系