google/protocol-buffers

Protocol Buffers : Language Guide (proto3) - Any

C/H 2018. 9. 1. 08:30

Index

Any

The Any message type lets you use messages as embedded types without having their .proto definition. An Any contains an arbitrary serialized message as bytes, along with a URL that acts as a globally unique identifier for and resolves to that message's type. To use the Any type, you need to import google/protobuf/any.proto.
모든 메시지 유형을 사용하면 .proto 정의 없이 메시지를 포함된 유형으로 사용할 수 있다. Any에는 임의 직렬화 메시지가 바이트로 포함되어 있으며, 이 URL은 해당 메시지 유형에 대해 전역 고유 식별자의 역할을 하며 해당 메시지 유형에 대해 확인한다. Any type을 사용하려면 google/prooff/any.proto를 가져와야 한다.

import "google/protobuf/any.proto";

message ErrorStatus {
  string message = 1;
  repeated google.protobuf.Any details = 2;
}

The default type URL for a given message type is type.googleapis.com/packagename.messagename.
지정된 메시지에 대한 기본 타입 URL: type is type.googleapis.com/packagename.messagename.

Different language implementations will support runtime library helpers to pack and unpack Any values in a typesafe manner – for example, in Java, the Any type will have special pack() and unpack() accessors, while in C++ there are PackFrom() and UnpackTo() methods:
다양한 언어 구현으로 런타임 라이브러리 도움말로 모든 값을 안전하게 포장 및 해제할 수 있다. – 예를 들어, Java의 경우 Any type은 특수 팩() 및 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 network_error;
    detail.UnpackTo(&network_error);
    ... processing network_error ...
  }
}

Currently the runtime libraries for working with Any types are under development. 현재 모든 유형의 작업을 위한 런타임 라이브러리가 개발 중이다.

If you are already familiar with proto2 syntax, the Any type replaces extensions. proto2 구문에 이미 익숙한 경우 모든 유형이 확장을 대체한다.

반응형