当 thrift 反序列化并再次序列化时,它是否会保留未知的字段/字节?

rui*_*rui 5 c# thrift protocol-buffers

所以这个例子是:

我有消息类型。它在服务器 A -> B -> C 之间传递 现在假设消息的 2.0 版被创建,它有几个新的字段/ID。服务器 A 和 C 知道这种新格式,但服务器 B 仍在使用旧格式。所有服务器都会反序列化、检查、序列化并发送消息。假设 A 正在填充所有字段(Message V1.0 和 V2.0),C 会看到 Message V2.0 的填充字段吗?

我知道协议缓冲区支持这一点。我想知道 Thrift 是否也支持它。(在我用 C# 做的一个快速测试中,答案是否定的,只是想和大家核对一下)

作为 Message 代码的一个例子,这里是 IDL:

struct Message { // V1.0
  1: i64 Id;
}
Run Code Online (Sandbox Code Playgroud)

.

struct Message { // V2.0
  1: i64 Id;
  2: string Content;
}
Run Code Online (Sandbox Code Playgroud)

服务器 C 会看到填充在 A 中的 Message.Content 吗?

rui*_*rui 1

答案是

关于 Protocol Buffers,还需要注意的是,根据文档,生成的代码的 Python 版本不支持这一点。

https://developers.google.com/protocol-buffers/docs/encoding#order - “如果消息具有未知字段,当前的 Java 和 C++ 实现会在按顺序排序的已知字段之后以任意顺序写入它们。当前的 Python实现不跟踪未知字段。”