使用协议缓冲区,将枚举从内部消息移动到外部消息是否安全?

Dan*_*rdt 6 enums protocol-buffers

我遇到了一个用例,我想将在协议缓冲区消息中声明的枚举移动到消息外部,以便其他消息 van 使用相同的枚举。

即,我想知道是否存在任何问题

message Message {
   enum Enum {
       VALUE1 = 1;
       VALUE2 = 2;
   } 
   optional Enum enum_value = 1;
}
Run Code Online (Sandbox Code Playgroud)

对此

enum Enum {
    VALUE1 = 1;
    VALUE2 = 2;
}
message Message {
    optional Enum enum_value = 1;
}
Run Code Online (Sandbox Code Playgroud)

这会导致将使用第一个协议缓冲区定义创建的数据反序列化为第二个的任何问题吗?

Mar*_*ell 7

它根本不改变序列化数据——枚举的位置/名称与实际数据无关,因为它只存储整数值。

什么可能改变的是某些语言如何消耗的枚举,即它们如何限定它。难道X.Y.FooX.Foo或只Foo。请注意,由于枚举遵循 C++ 命名/范围规则,因此某些事情(例如冲突)不是问题:但它可能会影响某些语言作为使用者。

所以:如果你是 .proto 的唯一消费者,那么你在这里绝对没问题。如果您已与其他人共享 .proto,则更改它可能会出现问题,除非他们乐于更新其代码以匹配任何新的资格要求。