protobuf-net 缺少可选字段的has_函数

本文关键字:has 函数 字段 protobuf-net | 更新日期: 2023-09-27 18:31:50

我们使用协议缓冲区在本机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中遗漏了一些东西,这实际上是可能的

提前感谢。维姆

protobuf-net 缺少可选字段的has_函数

(我知道我们已经在问题跟踪器中介绍了这一点 - 这纯粹是为了可见性等)

这与从.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选择性地生成,它们基本上意味着"非默认",如果这有助于一些真正的编码场景。