1 2 3 4SampleMessagemessage;SubMessage*sub_message=message.mutable_sub_message();message.set_name("name");// Will delete sub_messagesub_message->set_...// Crashes here
在C++ 中,如果使用Swap()方法交换两个包含oneof的Message 的值,该Message 或去获取到另一个 Message 中Oneof 持有的值。示例如下,交换值之后msg1中的oneof字段的值为交换前msg2中的值sub_message:
1 2 3 4 5 6 7SampleMessagemsg1;msg1.set_name("name");SampleMessagemsg2;msg2.mutable_sub_message();msg1.swap(&msg2);CHECK(msg1.has_sub_message());CHECK(msg2.has_name());
兼容性问题
再添加或删除oneof字段的时候需要小心:如果oneof字段返回的值为None或NO_SET可能意味着两种情况,该字段没有被赋值或者赋值的字段为其他版本中的oneof字段。解析器无法知道字节序列中的未知字段是否是oneof中的成员,所以无法区别上边两种情况。
标识重用的问题:
向oneof中加入字段或将oneof中的字段移出:这种情况下在消息序列化或反序列化之后我们可能会丢失一些字段信息。但是我们可以安全的将单个字段加入到一个新的oneof字段中;而且如果能够确认oneof字段只包含了一个成员,那么我们可以移入多个成员。删除oneof字段后又添加回来:在消息序列化或反序列化后可能导致当前的oneof字段被清除。拆分或合并:这种情况和第一种情况是一致的。
Maps
我们可以通过下面的语法创建一个 Map 类型的字段:
map