- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要修复一个 grpc 服务,所以我想了解编译它们的逻辑。
在下面的示例中,我不明白为什么 protoc 不编译 address.proto
,因为它是由 person.proto
导入的。
没有构建错误,所以我认为这不是导入/命名问题。不幸的是,只生成了一个person_pb2.py
...
// file: address.proto
syntax="proto3";
message Address {
string city = 1;
string road = 3;
int32 roadNumber = 4;
}
// file: person.proto
syntax="proto3";
import "address.proto";
message Person {
string name = 1;
Address home = 3;
Address work = 4;
}
构建命令:
python -m grpc_tools.protoc --proto_path ../protos --python_out=. person.proto
最佳答案
这是一个合理的问题。
答案是你只是要求 protoc
来编译 person.proto
(而且它是按字面意思)。但是,生成的代码不会运行,因为 person_pb2.py
依赖于 address_pb2
:
import address_pb2 as address__pb2
您需要为您的代码所需的所有 Protocol Buffer 类型提供 Python 源代码。
python3 \
-m grpc_tools.protoc \
--proto_path=../protos \
--python_out=. \
person.proto address.proto
这个问题(正在解决)的一个很好的例子是谷歌所谓的 Well-Known Types (WKTs)
您可以包括例如google.protobuf.Timestamp
在 Person
中添加 import "google/protobuf/timestamp.proto"
:
syntax="proto3";
import "google/protobuf/timestamp.proto";
import "address.proto";
message Person {
string name = 1;
Address home = 3;
Address work = 4;
google.protobuf.Timestamp timestamp = 5;
}
并且您可以protoc
无需更改并且您的代码将工作。
这是因为 Google 将 WKTs 和生成的 Python 代码与 grpcio-tool
捆绑在一起。与任何其他来源一样,您确实需要导入 Google 提供的 Python 来源才能使用代码。
为此,你必须
main.py
:
import address_pb2
import person_pb2
from google.protobuf.timestamp_pb2 import Timestamp
那么,这些文件在哪里?
以我为例:
lib/python3.8/site-packages/grpc_tools/_proto/google/protobuf/timestamp.proto
和:
lib/python3.8/site-packages/google/protobuf/timestamp_pb2.py
NOTE
It's convenient that Google bundles the generated sources but this is not required and it creates two potential problems.
timestamp.proto
is the source-of-truth and we must assume|trust thatgoogle/protobuf/timestamp_pb2.py
was generated from it.- If we're the proto developer, we're expected to produce sources for all languages that our proto's developers may use every time we update the protos.
For these reasons, generally (!) developers provide only the protos and don't include generated sources and assume that you're able to plug the proto into
protoc
and generated the perfect facsimile as code yourself.
关于protocol-buffers - 如何让 protoc 编译一个 proto 及其依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70295689/
我期望 new Buffer(buffer.toString()) 始终是逐字节相等的。但是,我遇到的情况并非如此。 首先,这是一个真实的案例: var buf1 = new Buffer(32);
我有用于记录数据的 Protocol Buffer 。 message Message { required double val1 = 1; optional int val2 =
请注意以下简单程序(基于 protobuf-net 项目 v1 wiki 中的示例): using System.Collections.Generic; using System.Diagnosti
在 Protocol Buffer 中,有没有办法让消息包含嵌套消息的集合?例如,消息主管可能有一个员工集合以及主管的姓名和部门。 最佳答案 是的。您使用 repeated领域; message Em
我想知道 Protocol Buffer 在解析流时如何处理损坏的数据。有没有办法知道数据是否已损坏。 Protocol Buffer 是否提供任何内置的数据完整性检查机制? 谢谢, 最佳答案 没有任
Protocol Buffer 如何处理类型版本控制? 例如,当我需要随时间更改类型定义时?就像添加和删除字段一样。 最佳答案 Google 设计的 protobuf 对版本控制非常宽容: 意外数据要
我尝试阅读 Protobuf 文档,但无法想象它可以用于许多用例。我想知道一些实际的 Protocol Buffer 性能改进用例。 谢谢 最佳答案 Protocol buffers 是一个序列化库,
给定 Protocol Buffer 模式和一些数据, Protocol Buffer 序列化是否跨库和语言具有确定性? 基本上,无论使用什么库,我是否可以保证相同的数据总是以相同的方式(直到字节)序
我正在使用一个示例 UWP C++/CX 程序,该程序创建两个 UDP 网络通信线程,它们使用 Windows::Storage::Streams::DataWriter 相互发送数据。和 Windo
我正在使用以下代码 int lenSend = odl->ByteSize(); char* buf = (char *)malloc(lenSend); odl->SerializeToArray(
Protocol Buffer 文档警告说...... You should never add behaviour to the generated classes by inheriting fr
我有一个定义如下的原型(prototype)模式, message User { int64 id = 1; bool email_subscribed = 2; bool sms_
我试图了解 Protocol Buffer 编码方法,将消息转换为二进制(或十六进制)格式时,我无法理解嵌入消息的编码方式。 我猜可能和内存地址有关,但我找不到准确的关系。 这是我所做的。 第 1 步
我需要序列化和反序列化一系列与字节流之间的 Protocol Buffer 消息。有一些预先确定的消息类型。编码类型信息的推荐方法是什么,以便我的应用程序可以知道它应该读取哪种类型? 最佳答案 最常见
与GSON相比, Protocol Buffer (protobuf)的优缺点是什么? 在什么情况下,protobuf比GSON更合适? 对于一个非常笼统的问题,我感到抱歉。 最佳答案 json(通过
message Person { required Empid = 1 [default = 100]; required string name = 2 [default = "Raju"]
我正在研究一个小型设备,该设备具有相当大的一组配置参数(~100 KB),这些参数是从 PC 软件生成的。过去,我们将参数存储在二进制文件中并将它们加载到数据结构中。维护有点烦人(不同的语言,确保结构
来自Encoding - Protocol Buffers - Google Code上的“签名类型”: ZigZag encoding maps signed integers to unsigne
我正在使用 Protocol Buffer ,一切正常。除了我不明白的事实 - 为什么我需要 proto 中的编号标签文件 : message SearchRequest { required s
Protocol Buffer 的吸引人的功能之一是它允许您扩展消息定义,而不会破坏使用较旧定义的代码。对于枚举according to the documentation: a field with
我是一名优秀的程序员,十分优秀!