public sealed class Any : IMessage<Any>, IEquatable<Any>, IDeepCloneable<Any>, IBufferMessage, IMessage
Any
contains an arbitrary serialized protocol buffer message along with a
URL that describes the type of the serialized message.
Protobuf library provides support to pack/unpack Any values in the form of utility functions or additional generated methods of the Any type.
Example 1: Pack and unpack a message in C++.
Foo foo = ...;
Any any;
any.PackFrom(foo);
...
if (any.UnpackTo(&foo)) {
...
}
Example 2: Pack and unpack a message in Java.
Foo foo = ...;
Any any = Any.pack(foo);
...
if (any.is(Foo.class)) {
foo = any.unpack(Foo.class);
}
// or ...
if (any.isSameTypeAs(Foo.getDefaultInstance())) {
foo = any.unpack(Foo.getDefaultInstance());
}
Example 3: Pack and unpack a message in Python.
foo = Foo(...)
any = Any()
any.Pack(foo)
...
if any.Is(Foo.DESCRIPTOR):
any.Unpack(foo)
...
Example 4: Pack and unpack a message in Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
if err != nil {
...
}
...
foo := &pb.Foo{}
if err := any.UnmarshalTo(foo); err != nil {
...
}
The pack methods provided by protobuf library will by default use 'type.googleapis.com/full.type.name' as the type URL and the unpack methods only use the fully qualified type name after the last '/' in the type URL, for example "foo.bar.com/x/y.z" will yield type name "y.z".
JSON
The JSON representation of an Any
value uses the regular
representation of the deserialized, embedded message, with an
additional field @type
which contains the type URL. Example:
package google.profile;
message Person {
string first_name = 1;
string last_name = 2;
}
{
"@type": "type.googleapis.com/google.profile.Person",
"firstName": <string>,
"lastName": <string>
}
If the embedded message type is well-known and has a custom JSON
representation, that representation will be embedded adding a field
value
which holds the custom JSON in addition to the @type
field. Example (for message [google.protobuf.Duration][]):
{
"@type": "type.googleapis.com/google.protobuf.Duration",
"value": "1.212s"
}
Namespace
Google.Protobuf.WellKnownTypesAssembly
Google.Protobuf.dll
Constructors
Any()
public Any()
Any(Any)
public Any(Any other)
Parameter | |
---|---|
Name | Description |
other |
Any |
Fields
TypeUrlFieldNumber
public const int TypeUrlFieldNumber = 1
Field number for the "type_url" field.
Field Value | |
---|---|
Type | Description |
int |
ValueFieldNumber
public const int ValueFieldNumber = 2
Field number for the "value" field.
Field Value | |
---|---|
Type | Description |
int |
Properties
Descriptor
public static MessageDescriptor Descriptor { get; }
Property Value | |
---|---|
Type | Description |
MessageDescriptor |
Parser
public static MessageParser<Any> Parser { get; }
Property Value | |
---|---|
Type | Description |
MessageParserAny |
TypeUrl
public string TypeUrl { get; set; }
A URL/resource name that uniquely identifies the type of the serialized
protocol buffer message. This string must contain at least
one "/" character. The last segment of the URL's path must represent
the fully qualified name of the type (as in
path/google.protobuf.Duration
). The name should be in a canonical form
(e.g., leading "." is not accepted).
In practice, teams usually precompile into the binary all types that they
expect it to use in the context of Any. However, for URLs which use the
scheme http
, https
, or no scheme, one can optionally set up a type
server that maps type URLs to message definitions as follows:
- If no scheme is provided,
https
is assumed. - An HTTP GET on the URL must yield a [google.protobuf.Type][] value in binary format, or produce an error.
- Applications are allowed to cache lookup results based on the URL, or have them precompiled into a binary to avoid any lookup. Therefore, binary compatibility needs to be preserved on changes to types. (Use versioned type names to manage breaking changes.)
Note: this functionality is not currently available in the official protobuf release, and it is not used for type URLs beginning with type.googleapis.com. As of May 2023, there are no widely used type server implementations and no plans to implement one.
Schemes other than http
, https
(or the empty scheme) might be
used with implementation specific semantics.
Property Value | |
---|---|
Type | Description |
string |
Value
public ByteString Value { get; set; }
Must be a valid serialized protocol buffer of the above specified type.
Property Value | |
---|---|
Type | Description |
ByteString |
Methods
CalculateSize()
public int CalculateSize()
Calculates the size of this message in Protocol Buffer wire format, in bytes.
Returns | |
---|---|
Type | Description |
int |
The number of bytes required to write this message to a coded output stream. |
Clone()
public Any Clone()
Creates a deep clone of this object.
Returns | |
---|---|
Type | Description |
Any |
A deep clone of this object. |
Equals(Any)
public bool Equals(Any other)
Parameter | |
---|---|
Name | Description |
other |
Any |
Returns | |
---|---|
Type | Description |
bool |
Equals(object)
public override bool Equals(object other)
Parameter | |
---|---|
Name | Description |
other |
object |
Returns | |
---|---|
Type | Description |
bool |
GetHashCode()
public override int GetHashCode()
Returns | |
---|---|
Type | Description |
int |
GetTypeName(string)
public static string GetTypeName(string typeUrl)
Retrieves the type name for a type URL, matching the FullName of the packed message type.
Parameter | |
---|---|
Name | Description |
typeUrl |
string The URL to extract the type name from |
Returns | |
---|---|
Type | Description |
string |
The type name |
This is always just the last part of the URL, after the final slash. No validation of anything before the trailing slash is performed. If the type URL does not include a slash, an empty string is returned rather than an exception being thrown; this won't match any types, and the calling code is probably in a better position to give a meaningful error.
There is no handling of fragments or queries at the moment.
Is(MessageDescriptor)
public bool Is(MessageDescriptor descriptor)
Returns a bool indictating whether this Any message is of the target message type
Parameter | |
---|---|
Name | Description |
descriptor |
MessageDescriptor The descriptor of the message type |
Returns | |
---|---|
Type | Description |
bool |
|
MergeFrom(CodedInputStream)
public void MergeFrom(CodedInputStream input)
Merges the data from the specified coded input stream with the current message.
Parameter | |
---|---|
Name | Description |
input |
CodedInputStream |
See the user guide for precise merge semantics.
MergeFrom(Any)
public void MergeFrom(Any other)
Merges the given message into this one.
Parameter | |
---|---|
Name | Description |
other |
Any |
See the user guide for precise merge semantics.
Pack(IMessage)
public static Any Pack(IMessage message)
Packs the specified message into an Any message using a type URL prefix of "type.googleapis.com".
Parameter | |
---|---|
Name | Description |
message |
IMessage The message to pack. |
Returns | |
---|---|
Type | Description |
Any |
An Any message with the content and type URL of |
Pack(IMessage, string)
public static Any Pack(IMessage message, string typeUrlPrefix)
Packs the specified message into an Any message using the specified type URL prefix.
Parameters | |
---|---|
Name | Description |
message |
IMessage The message to pack. |
typeUrlPrefix |
string The prefix for the type URL. |
Returns | |
---|---|
Type | Description |
Any |
An Any message with the content and type URL of |
ToString()
public override string ToString()
Returns | |
---|---|
Type | Description |
string |
TryUnpack<T>(out T)
public bool TryUnpack<T>(out T result) where T : IMessage, new()
Attempts to unpack the content of this Any message into the target message type, if it matches the type URL within this Any message.
Parameter | |
---|---|
Name | Description |
result |
T |
Returns | |
---|---|
Type | Description |
bool |
|
Type Parameter | |
---|---|
Name | Description |
T |
The type of message to attempt to unpack the content into. |
Unpack(TypeRegistry)
public IMessage Unpack(TypeRegistry registry)
Attempts to unpack the content of this Any message into one of the message types in the given type registry, based on the type URL.
Parameter | |
---|---|
Name | Description |
registry |
TypeRegistry The type registry to consult for messages. |
Returns | |
---|---|
Type | Description |
IMessage |
The unpacked message, or |
Unpack<T>()
public T Unpack<T>() where T : IMessage, new()
Unpacks the content of this Any message into the target message type, which must match the type URL within this Any message.
Returns | |
---|---|
Type | Description |
T |
The unpacked message. |
Type Parameter | |
---|---|
Name | Description |
T |
The type of message to unpack the content into. |
Exceptions | |
---|---|
Type | Description |
InvalidProtocolBufferException |
The target message type doesn't match the type URL in this message |
WriteTo(CodedOutputStream)
public void WriteTo(CodedOutputStream output)
Writes the data to the given coded output stream.
Parameter | |
---|---|
Name | Description |
output |
CodedOutputStream Coded output stream to write the data to. Must not be null. |