使用协议缓冲区,将枚举从内部消息移动到外部消息是否安全?
With Protocol Buffers, is it safe to move enum from inside message to outside message?
我已经 运行 进入一个用例,我想将在协议缓冲区消息内声明的枚举移动到消息外部,以便其他消息使用相同的枚举。
也就是说,我想知道是否有任何问题从这里开始
message Message {
enum Enum {
VALUE1 = 1;
VALUE2 = 2;
}
optional Enum enum_value = 1;
}
至此
enum Enum {
VALUE1 = 1;
VALUE2 = 2;
}
message Message {
optional Enum enum_value = 1;
}
这会导致将使用第一个协议缓冲区定义创建的数据反序列化到第二个中时出现任何问题吗?
它根本不改变序列化数据——枚举的位置/名称与实际数据无关,因为它只存储整数值。
可能改变的是某些语言使用枚举的方式,即它们如何限定枚举。是 X.Y.Foo
、X.Foo
还是 Foo
。请注意,由于枚举遵循 C++ naming/scoping 规则,因此某些事情(例如冲突)不是问题:但它可能会影响某些语言作为消费者。
因此:如果您是 .proto 的唯一消费者,那么您在这里绝对没问题。如果您与其他人共享了 .proto,那么更改它可能会有问题,除非他们愿意更新他们的代码以符合任何新的资格要求。
我已经 运行 进入一个用例,我想将在协议缓冲区消息内声明的枚举移动到消息外部,以便其他消息使用相同的枚举。
也就是说,我想知道是否有任何问题从这里开始
message Message {
enum Enum {
VALUE1 = 1;
VALUE2 = 2;
}
optional Enum enum_value = 1;
}
至此
enum Enum {
VALUE1 = 1;
VALUE2 = 2;
}
message Message {
optional Enum enum_value = 1;
}
这会导致将使用第一个协议缓冲区定义创建的数据反序列化到第二个中时出现任何问题吗?
它根本不改变序列化数据——枚举的位置/名称与实际数据无关,因为它只存储整数值。
可能改变的是某些语言使用枚举的方式,即它们如何限定枚举。是 X.Y.Foo
、X.Foo
还是 Foo
。请注意,由于枚举遵循 C++ naming/scoping 规则,因此某些事情(例如冲突)不是问题:但它可能会影响某些语言作为消费者。
因此:如果您是 .proto 的唯一消费者,那么您在这里绝对没问题。如果您与其他人共享了 .proto,那么更改它可能会有问题,除非他们愿意更新他们的代码以符合任何新的资格要求。