protobuf 中可选字段赋值运算符的行为
Behaviour of assignment operator for optional fields in protobuf
我的 .proto 文件中定义了一条消息 Message。它有两个字段,必填字段和可选字段。
message Message
{
required int32 requiredField = 1;
optional int32 optionalField = 2;
}
Java 生成的代码有其关联的 class Message
,我有它的两个对象 oMessage1
和 oMessage2
。 oMessage1
在其 optionalField
中持有一些价值,但 oMessage2
在其中没有持有任何价值(作为其可选)。
我的问题是:
当我执行 oMessage1 = oMessage2
时,oMessage1
的 optionalField
的值会发生什么变化?
- 它消失了吗? (因为
oMessage2
没有)
或者
- 还是一样吗? (因为
oMessage1
拥有它 因此 赋值运算符注意不要用不存在的字段覆盖它)
我在文档中找不到它的答案。生成的代码太大,我无法分析,因为我对 Java 比较陌生 :( 理想情况下,我希望 #2 是一个答案。但我想与 Protobuf 专家进行验证,以便我可以在我的代码。
非常感谢!
对于对象变量,Java中的赋值运算符只是对引用进行赋值。 oMessage1 也将指向 oMessage2 表示的对象。分配后访问 oMessage1 将与访问 oMessage2 相同。
oMessage1 引用的协议缓冲区可能会完全消失(= 由 garabge collection 收集)如果没有其他引用它。
我的 .proto 文件中定义了一条消息 Message。它有两个字段,必填字段和可选字段。
message Message
{
required int32 requiredField = 1;
optional int32 optionalField = 2;
}
Java 生成的代码有其关联的 class Message
,我有它的两个对象 oMessage1
和 oMessage2
。 oMessage1
在其 optionalField
中持有一些价值,但 oMessage2
在其中没有持有任何价值(作为其可选)。
我的问题是:
当我执行 oMessage1 = oMessage2
时,oMessage1
的 optionalField
的值会发生什么变化?
- 它消失了吗? (因为
oMessage2
没有) 或者 - 还是一样吗? (因为
oMessage1
拥有它 因此 赋值运算符注意不要用不存在的字段覆盖它)
我在文档中找不到它的答案。生成的代码太大,我无法分析,因为我对 Java 比较陌生 :( 理想情况下,我希望 #2 是一个答案。但我想与 Protobuf 专家进行验证,以便我可以在我的代码。
非常感谢!
对于对象变量,Java中的赋值运算符只是对引用进行赋值。 oMessage1 也将指向 oMessage2 表示的对象。分配后访问 oMessage1 将与访问 oMessage2 相同。
oMessage1 引用的协议缓冲区可能会完全消失(= 由 garabge collection 收集)如果没有其他引用它。