Protobuf3 Any类型
Protobuf3 Any类型
Any消息类型允许您将消息作为嵌入类型,而不需要它们 .proto定义。Any包含任意序列化的消息(字节),以及一个URL,该URL充当该消息的全局唯一标识符并解析为该消息的类型。要使用Any类型,你需要导入google/protobuf/any.proto.
import "google/protobuf/any.proto";
message ErrorStatus {
string message = 1;
repeated google.protobuf.Any details = 2;
}指定消息类型的默认类型URL是type.googleapis.com/packagename.messagename.
不同的语言实现将支持运行时库助手以typesafe方式打包和解压缩ANY类型的值——例如,在Java中,任何类型都有特殊的pack()和unpack()访问器,而在c++中有PackFrom()和UnpackTo()方法:
// Storing an arbitrary message type in Any.
NetworkErrorDetails details = ...;
ErrorStatus status;
status.add_details()->PackFrom(details);
// Reading an arbitrary message from Any.
ErrorStatus status = ...;
for (const Any& detail : status.details()) {
if (detail.Is<NetworkErrorDetails>()) {
NetworkErrorDetails network_error;
detail.UnpackTo(&network_error);
... processing network_error ...
}
}目前正在开发用于处理ANY类型的运行时库。
如果您已经熟悉proto2语法,ANY类型会替换扩展名。