c# - protobuf 包是如何使用的?

标签 c# python-3.x package protocol-buffers

我不明白谷歌 Python protobuf 文档中关于软件包的最后一句的第一部分:

The .proto file starts with a package declaration, which helps to prevent naming conflicts between different projects. In Python, packages are normally determined by directory structure, so the package you define in your .proto file will have no effect on the generated code. However, you should still declare one to avoid name collisions in the Protocol Buffers name space as well as in non-Python languages.



在 Python 中(可能因此在确实使用命名空间的语言中)“您在 .proto 文件中定义的包对生成的代码没有影响”实际上是错误的,因为生成的 ..._pb2.py文件包含具有包字段的描述符。
DESCRIPTOR = _descriptor.FileDescriptor(
  name='example.proto',
  package='example',
  syntax='proto3',
   ...
)

我查过了,你不能import example生成代码后进入一个普通的python文件。即声明 package example;在您的 .proto文件,然后 protoc编译它不会自动使您的包可用于在您的环境中的 python 文件中导入(您仍然必须使用 import ..._pb2 来访问这些类)。

任何人都可以解释如何在 .proto 中声明包文件在 Python 和 C# 中都使用,作为明确使用命名空间的语言的一个例子?

最佳答案

引用文档本身:

In Python, the package directive is ignored, since Python modules are organized according to their location in the file system.


那么包声明到底有什么用呢?
我相信两件事:
  • 避免消息对象中命名冲突的可能性。如果假设您有一条消息在同一应用程序下被不同地声明,那么您可以考虑在 proto 文件的开头提供包说明符,然后使用在定义其他消息类型的字段时指定的包。例如,如果 Foopackage bar 下定义和 package baz两个都;然后使用 bar.Foobaz.Foo任何需要的地方。
  • 对于 便携性 .包指令在 Python 和 Golang 中都被忽略。但是像 C++ 和 C# 这样显式创建命名空间的语言会考虑指定的包。所以对于 Foo在上面的例子中,一个名为 Foo 的消息类型将在 bar 的命名空间中声明和 baz .您使用 Python 应用程序创建的 proto 文件可以以几乎相同的方式为您的 C# 应用程序编译。需要注意的是,Protobuf 是用于序列化和反序列化数据的语言不可知机制。

  • 话虽如此,我个人并没有发现在我的 Python 应用程序的 protobuf 消息中使用包说明符。
    引用:https://developers.google.com/protocol-buffers/docs/proto

    关于c# - protobuf 包是如何使用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54434747/

    相关文章:

    regex - 查找最里面的大括号中以给定子字符串的单词开头的文本

    r - 创建具有外部依赖项的包

    python - Python 中现有模块的 ImportError

    linux - 无法找到 RHEL 8 的 libnl RPM 软件包?

    c# - AppDomain,运行程序集 .exe 或 .dll?

    c# - Silverlight 自定义控件创建自定义事件

    python - 为什么在函数中使用字符串解包后,输出中会出现逗号?

    c# - 将窗口样式设置为无后,如何删除 wpf 窗口顶部的白色 strip

    c# - 值与 ListItem 中的 Text 相同

    python - 修改 tk.Button 上的部分文本