我最近在Google的包装中遇到了各种各样的包装器protobuf。我正在努力想象用例。任何人都可以阐明:这些问题打算解决什么问题?
这是文档链接之一:https : //developers.google.com/protocol-buffers/docs/reference/csharp/class/google/protobuf/well-known-types/string-value(它什么也没说用于)。
这与简单string类型在行为上会有所不同的一件事是,此字段的写入效率较低(几个额外的字节,外加冗余的内存分配)。对于其他包装器而言,情况更糟,因为repeated这些字段的变体编写效率低下(Google的Protobuf官方序列化器不支持packed非数字类型的编码)。
似乎都不是可取的。那么,这是怎么回事?
Geo*_*rge 22
有几个原因,主要与使用这些的地方有关 - 请参阅struct.proto。
StringValue可以为 null,string通常不能使用与 protobuf 接口的语言。例如在 Go 中,字符串总是被设置的;字符串的“零值”是“”,即空字符串,因此无法区分“此值有意设置为空字符串”和“没有值存在”。StringValue可以为空,因此解决了这个问题。当它们在 中使用时尤其重要StructValue,它可能代表任意 JSON:为此,它需要区分设置为空字符串(StringValue带有空字符串)的 JSON 键或未设置的 JSON 键全部(空StringValue)。
此外,如果您查看 struct.proto,您会发现这些在 proto 中并不是完全成熟的消息类型——它们都是从 生成的message Value,它有一个oneof kind { number_value, string_value, bool_value...等。通过使用oneofstruct.proto 可以表示各种不同的一个字段中的值。考虑到 struct.proto 旨在处理什么 - 任意 JSON - 你不知道给定的 JSON 键有什么类型的值,这再次是有道理的。
| 归档时间: |
|
| 查看次数: |
3274 次 |
| 最近记录: |