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類型會替換擴展名。