Tim*_*sky 5 python protocol-buffers protoc
我一直致力于为项目实施IPC的protobufs.由于某种原因,未设置/序列化设置为0的值.对于上下文,.proto文件包含以下消息:
syntax = "proto3";
enum SetGet {
SET = 0;
GET = 1;
}
message State {
SetGet setget = 1;
double x = 2;
double y = 3;
double depth = 4;
double yaw = 5;
double pitch = 6;
double roll = 7;
}
Run Code Online (Sandbox Code Playgroud)
我使用protoc将文件编译为Python _pb2文件,然后尝试运行以下测试脚本:
import filename_pb2 as pb
state = pb.State()
state.x = 0
state.y = 0
state.depth = 0
state.yaw = 0
state.pitch = 0
state.roll = 0
state.setget = pb.SET
print("State: {}".format(state))
state2 = pb.State()
state2.ParseFromString(state.SerializeToString())
print("State2: {}".format(state2))
Run Code Online (Sandbox Code Playgroud)
当我运行它时,打印以下输出:
State:
State2:
Run Code Online (Sandbox Code Playgroud)
似乎没有设置任何东西,或零值以某种方式被忽略.但是,当我将值(x,y,深度等)更改为非零值(例如0.1)时,我得到以下预期结果:
State: x: 0.1
y: 0.1
depth: 0.1
yaw: 0.1
pitch: 0.1
roll: 0.1
State2: x: 0.1
y: 0.1
depth: 0.1
yaw: 0.1
pitch: 0.1
roll: 0.1
Run Code Online (Sandbox Code Playgroud)
即使数字被打印出来,由于某种原因,枚举仍然不是.为什么这会发生在protobufs上?默认情况下是double类型0,因此protobuf序列化程序会忽略它们来节省空间吗?那么,为什么在解析State2时它们没有被恢复?我错过了文档中的某些内容吗?提前致谢!
- 蒂姆
Mar*_*ell 10
最近这一点发生了变化;proto3 现在支持存在跟踪,通过添加optional关键字来启用:
message State {
optional SetGet setget = 1;
optional double x = 2;
optional double y = 3;
optional double depth = 4;
optional double yaw = 5;
optional double pitch = 6;
optional double roll = 7;
}
Run Code Online (Sandbox Code Playgroud)
来自https://github.com/protocolbuffers/protobuf/blob/master/CHANGES.txt:
2021-02-05 版本 3.15.0 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
协议编译器
- 默认情况下启用 proto3 的可选字段,并且不再需要 --experimental_allow_proto3_optional 标志。
这是它的 RTM:
2020-05-12 版本 3.12.0 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
协议编译器
- [实验] proto3 中的单一非消息类型字段现在支持存在跟踪。这是通过添加“可选”字段标签并将 --experimental_allow_proto3_optional 标志传递给 protoc 来启用的。
protobuf 中数字的默认值为零,字符串的默认值是空字符串。为了提高效率,默认值不会通过线路传输。
如果您确实希望能够判断它是否已显式设置,请不要在实际操作中使用默认零:
enum SetGet {
NONE = 0;
SET = 1;
GET = 2;
}
Run Code Online (Sandbox Code Playgroud)
请记住,这将导致线路上的额外流量,并且由于您只真正担心正在打印的内容,因此您也可以只了解零是默认值,或者编写自己的打印例程来输出所有内容。
| 归档时间: |
|
| 查看次数: |
1824 次 |
| 最近记录: |