Google.Protobuf.WellKnownTypes
Namespace with 39 public types
Classes
Any
`Any` contains an arbitrary serialized protocol buffer message along with a
URL that describes the type of the serialized message.
In its binary encoding, an `Any` is an ordinary message; but in other wire
forms like JSON, it has a special encoding. The format of the type URL is
described on the `type_url` field.
Protobuf APIs provide utilities to interact with `Any` values:
- A 'pack' operation accepts a message and constructs a generic `Any` wrapper
around it.
- An 'unpack' operation reads the content of an `Any` message, either into an
existing message or a new one. Unpack operations must check the type of the
value they unpack against the declared `type_url`.
- An 'is' operation decides whether an `Any` contains a message of the given
type, i.e. whether it can 'unpack' that type.
The JSON format representation of an `Any` follows one of these cases:
- For types without special-cased JSON encodings, the JSON format
representation of the `Any` is the same as that of the message, with an
additional `@type` field which contains the type URL.
- For types with special-cased JSON encodings (typically called 'well-known'
types, listed in https://protobuf.dev/programming-guides/json/#any), the
JSON format representation has a key `@type` which contains the type URL
and a key `value` which contains the JSON-serialized value.
The text format representation of an `Any` is like a message with one field
whose name is the type URL in brackets. For example, an `Any` containing a
`foo.Bar` message may be written `[type.googleapis.com/foo.Bar] { a: 2 }`.
Api
Api is a light-weight descriptor for an API Interface.
Interfaces are also described as "protocol buffer services" in some contexts,
such as by the "service" keyword in a .proto file, but they are different
from API Services, which represent a concrete implementation of an interface
as opposed to simply a description of methods and bindings. They are also
sometimes simply referred to as "APIs" in other contexts, such as the name of
this message itself. See https://cloud.google.com/apis/design/glossary for
detailed terminology.
New usages of this message as an alternative to ServiceDescriptorProto are
strongly discouraged. This message does not reliability preserve all
information necessary to model the schema and preserve semantics. Instead
make use of FileDescriptorSet which preserves the necessary information.
BoolValue
Wrapper message for `bool`.
The JSON representation for `BoolValue` is JSON `true` and `false`.
Not recommended for use in new APIs, but still useful for legacy APIs and
has no plan to be removed.
BytesValue
Wrapper message for `bytes`.
The JSON representation for `BytesValue` is JSON string.
Not recommended for use in new APIs, but still useful for legacy APIs and
has no plan to be removed.
DoubleValue
Wrapper message for `double`.
The JSON representation for `DoubleValue` is JSON number.
Not recommended for use in new APIs, but still useful for legacy APIs and
has no plan to be removed.
Duration
A Duration represents a signed, fixed-length span of time represented
as a count of seconds and fractions of seconds at nanosecond
resolution. It is independent of any calendar and concepts like "day"
or "month". It is related to Timestamp in that the difference between
two Timestamp values is a Duration and it can be added or subtracted
from a Timestamp. Range is approximately +-10,000 years.
# Examples
Example 1: Compute Duration from two Timestamps in pseudo code.
Timestamp start = ...;
Timestamp end = ...;
Duration duration = ...;
duration.seconds = end.seconds - start.seconds;
duration.nanos = end.nanos - start.nanos;
if (duration.seconds < 0 && duration.nanos > 0) {
duration.seconds += 1;
duration.nanos -= 1000000000;
} else if (duration.seconds > 0 && duration.nanos < 0) {
duration.seconds -= 1;
duration.nanos += 1000000000;
}
Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
Timestamp start = ...;
Duration duration = ...;
Timestamp end = ...;
end.seconds = start.seconds + duration.seconds;
end.nanos = start.nanos + duration.nanos;
if (end.nanos < 0) {
end.seconds -= 1;
end.nanos += 1000000000;
} else if (end.nanos >= 1000000000) {
end.seconds += 1;
end.nanos -= 1000000000;
}
Example 3: Compute Duration from datetime.timedelta in Python.
td = datetime.timedelta(days=3, minutes=10)
duration = Duration()
duration.FromTimedelta(td)
# JSON Mapping
In JSON format, the Duration type is encoded as a string rather than an
object, where the string ends in the suffix "s" (indicating seconds) and
is preceded by the number of seconds, with nanoseconds expressed as
fractional seconds. For example, 3 seconds with 0 nanoseconds should be
encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
be expressed in JSON format as "3.000000001s", and 3 seconds and 1
microsecond should be expressed in JSON format as "3.000001s".
Empty
A generic empty message that you can re-use to avoid defining duplicated
empty messages in your APIs. A typical example is to use it as the request
or the response type of an API method. For instance:
service Foo {
rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
}
Enum
Enum type definition.
New usages of this message as an alternative to EnumDescriptorProto are
strongly discouraged. This message does not reliability preserve all
information necessary to model the schema and preserve semantics. Instead
make use of FileDescriptorSet which preserves the necessary information.
EnumValue
Enum value definition.
New usages of this message as an alternative to EnumValueDescriptorProto are
strongly discouraged. This message does not reliability preserve all
information necessary to model the schema and preserve semantics. Instead
make use of FileDescriptorSet which preserves the necessary information.
Field
A single field of a message type.
New usages of this message as an alternative to FieldDescriptorProto are
strongly discouraged. This message does not reliability preserve all
information necessary to model the schema and preserve semantics. Instead
make use of FileDescriptorSet which preserves the necessary information.
FieldMask
`FieldMask` represents a set of symbolic field paths, for example:
paths: "f.a"
paths: "f.b.d"
Here `f` represents a field in some root message, `a` and `b`
fields in the message found in `f`, and `d` a field found in the
message in `f.b`.
Field masks are used to specify a subset of fields that should be
returned by a get operation or modified by an update operation.
Field masks also have a custom JSON encoding (see below).
# Field Masks in Projections
When used in the context of a projection, a response message or
sub-message is filtered by the API to only contain those fields as
specified in the mask. For example, if the mask in the previous
example is applied to a response message as follows:
f {
a : 22
b {
d : 1
x : 2
}
y : 13
}
z: 8
The result will not contain specific values for fields x,y and z
(their value will be set to the default, and omitted in proto text
output):
f {
a : 22
b {
d : 1
}
}
A repeated field is not allowed except at the last position of a
paths string.
If a FieldMask object is not present in a get operation, the
operation applies to all fields (as if a FieldMask of all fields
had been specified).
Note that a field mask does not necessarily apply to the
top-level response message. In case of a REST get operation, the
field mask applies directly to the response, but in case of a REST
list operation, the mask instead applies to each individual message
in the returned resource list. In case of a REST custom method,
other definitions may be used. Where the mask applies will be
clearly documented together with its declaration in the API. In
any case, the effect on the returned resource/resources is required
behavior for APIs.
# Field Masks in Update Operations
A field mask in update operations specifies which fields of the
targeted resource are going to be updated. The API is required
to only change the values of the fields as specified in the mask
and leave the others untouched. If a resource is passed in to
describe the updated values, the API ignores the values of all
fields not covered by the mask.
If a repeated field is specified for an update operation, new values will
be appended to the existing repeated field in the target resource. Note that
a repeated field is only allowed in the last position of a `paths` string.
If a sub-message is specified in the last position of the field mask for an
update operation, then new value will be merged into the existing sub-message
in the target resource.
For example, given the target message:
f {
b {
d: 1
x: 2
}
c: [1]
}
And an update message:
f {
b {
d: 10
}
c: [2]
}
then if the field mask is:
paths: ["f.b", "f.c"]
then the result will be:
f {
b {
d: 10
x: 2
}
c: [1, 2]
}
An implementation may provide options to override this default behavior for
repeated and message fields.
Note that libraries which implement FieldMask resolution have various
different behaviors in the face of empty masks or the special "*" mask.
When implementing a service you should confirm these cases have the
appropriate behavior in the underlying FieldMask library that you desire,
and you may need to special case those cases in your application code if
the underlying field mask library behavior differs from your intended
service semantics.
Update methods implementing https://google.aip.dev/134
- MUST support the special value * meaning "full replace"
- MUST treat an omitted field mask as "replace fields which are present".
Other methods implementing https://google.aip.dev/157
- SHOULD support the special value "*" to mean "get all".
- MUST treat an omitted field mask to mean "get all", unless otherwise
documented.
## Considerations for HTTP REST
The HTTP kind of an update operation which uses a field mask must
be set to PATCH instead of PUT in order to satisfy HTTP semantics
(PUT must only be used for full updates).
# JSON Encoding of Field Masks
In JSON, a field mask is encoded as a single string where paths are
separated by a comma. Fields name in each path are converted
to/from lower-camel naming conventions.
As an example, consider the following message declarations:
message Profile {
User user = 1;
Photo photo = 2;
}
message User {
string display_name = 1;
string address = 2;
}
In proto a field mask for `Profile` may look as such:
mask {
paths: "user.display_name"
paths: "photo"
}
In JSON, the same mask is represented as below:
{
mask: "user.displayName,photo"
}
# Field Masks and Oneof Fields
Field masks treat fields in oneofs just as regular fields. Consider the
following message:
message SampleMessage {
oneof test_oneof {
string name = 4;
SubMessage sub_message = 9;
}
}
The field mask can be:
mask {
paths: "name"
}
Or:
mask {
paths: "sub_message"
}
Note that oneof type names ("test_oneof" in this case) cannot be used in
paths.
## Field Mask Verification
The implementation of any API method which has a FieldMask type field in the
request should verify the included field paths, and return an
`INVALID_ARGUMENT` error if any path is unmappable.
FloatValue
Wrapper message for `float`.
The JSON representation for `FloatValue` is JSON number.
Not recommended for use in new APIs, but still useful for legacy APIs and
has no plan to be removed.
Int32Value
Wrapper message for `int32`.
The JSON representation for `Int32Value` is JSON number.
Not recommended for use in new APIs, but still useful for legacy APIs and
has no plan to be removed.
Int64Value
Wrapper message for `int64`.
The JSON representation for `Int64Value` is JSON string.
Not recommended for use in new APIs, but still useful for legacy APIs and
has no plan to be removed.
ListValue
Represents a JSON array.
Method
Method represents a method of an API interface.
New usages of this message as an alternative to MethodDescriptorProto are
strongly discouraged. This message does not reliability preserve all
information necessary to model the schema and preserve semantics. Instead
make use of FileDescriptorSet which preserves the necessary information.
Mixin
Declares an API Interface to be included in this interface. The including
interface must redeclare all the methods from the included interface, but
documentation and options are inherited as follows:
- If after comment and whitespace stripping, the documentation
string of the redeclared method is empty, it will be inherited
from the original method.
- Each annotation belonging to the service config (http,
visibility) which is not set in the redeclared method will be
inherited.
- If an http annotation is inherited, the path pattern will be
modified as follows. Any version prefix will be replaced by the
version of the including interface plus the [root][] path if
specified.
Example of a simple mixin:
package google.acl.v1;
service AccessControl {
// Get the underlying ACL object.
rpc GetAcl(GetAclRequest) returns (Acl) {
option (google.api.http).get = "/v1/{resource=**}:getAcl";
}
}
package google.storage.v2;
service Storage {
rpc GetAcl(GetAclRequest) returns (Acl);
// Get a data record.
rpc GetData(GetDataRequest) returns (Data) {
option (google.api.http).get = "/v2/{resource=**}";
}
}
Example of a mixin configuration:
apis:
- name: google.storage.v2.Storage
mixins:
- name: google.acl.v1.AccessControl
The mixin construct implies that all methods in `AccessControl` are
also declared with same name and request/response types in
`Storage`. A documentation generator or annotation processor will
see the effective `Storage.GetAcl` method after inheriting
documentation and annotations as follows:
service Storage {
// Get the underlying ACL object.
rpc GetAcl(GetAclRequest) returns (Acl) {
option (google.api.http).get = "/v2/{resource=**}:getAcl";
}
...
}
Note how the version in the path pattern changed from `v1` to `v2`.
If the `root` field in the mixin is specified, it should be a
relative path under which inherited HTTP paths are placed. Example:
apis:
- name: google.storage.v2.Storage
mixins:
- name: google.acl.v1.AccessControl
root: acls
This implies the following inherited HTTP annotation:
service Storage {
// Get the underlying ACL object.
rpc GetAcl(GetAclRequest) returns (Acl) {
option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
}
...
}
Option
A protocol buffer option, which can be attached to a message, field,
enumeration, etc.
New usages of this message as an alternative to FileOptions, MessageOptions,
FieldOptions, EnumOptions, EnumValueOptions, ServiceOptions, or MethodOptions
are strongly discouraged.
SourceContext
`SourceContext` represents information about the source of a
protobuf element, like the file in which it is defined.
StringValue
Wrapper message for `string`.
The JSON representation for `StringValue` is JSON string.
Not recommended for use in new APIs, but still useful for legacy APIs and
has no plan to be removed.
Struct
Represents a JSON object.
An unordered key-value map, intending to perfectly capture the semantics of a
JSON object. This enables parsing any arbitrary JSON payload as a message
field in ProtoJSON format.
This follows RFC 8259 guidelines for interoperable JSON: notably this type
cannot represent large Int64 values or `NaN`/`Infinity` numbers,
since the JSON format generally does not support those values in its number
type.
If you do not intend to parse arbitrary JSON into your message, a custom
typed message should be preferred instead of using this type.
Timestamp
A Timestamp represents a point in time independent of any time zone or local
calendar, encoded as a count of seconds and fractions of seconds at
nanosecond resolution. The count is relative to an epoch at UTC midnight on
January 1, 1970, in the proleptic Gregorian calendar which extends the
Gregorian calendar backwards to year one.
All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
second table is needed for interpretation, using a [24-hour linear
smear](https://developers.google.com/time/smear).
The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
restricting to that range, we ensure that we can convert to and from [RFC
3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
# Examples
Example 1: Compute Timestamp from POSIX `time()`.
Timestamp timestamp;
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);
Example 2: Compute Timestamp from POSIX `gettimeofday()`.
struct timeval tv;
gettimeofday(&tv, NULL);
Timestamp timestamp;
timestamp.set_seconds(tv.tv_sec);
timestamp.set_nanos(tv.tv_usec * 1000);
Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
// A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
// is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
Timestamp timestamp;
timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
long millis = System.currentTimeMillis();
Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
.setNanos((int) ((millis % 1000) * 1000000)).build();
Example 5: Compute Timestamp from Java `Instant.now()`.
Instant now = Instant.now();
Timestamp timestamp =
Timestamp.newBuilder().setSeconds(now.getEpochSecond())
.setNanos(now.getNano()).build();
Example 6: Compute Timestamp from current time in Python.
timestamp = Timestamp()
timestamp.GetCurrentTime()
# JSON Mapping
In JSON format, the Timestamp type is encoded as a string in the
[RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
where {year} is always expressed using four digits while {month}, {day},
{hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
is required. A ProtoJSON serializer should always use UTC (as indicated by
"Z") when printing the Timestamp type and a ProtoJSON parser should be
able to accept both UTC and other timezones (as indicated by an offset).
For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
01:30 UTC on January 15, 2017.
In JavaScript, one can convert a Date object to this format using the
standard
[toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
method. In Python, a standard `datetime.datetime` object can be converted
to this format using
[`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
the Joda Time's [`ISODateTimeFormat.dateTime()`](
http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
) to obtain a formatter capable of generating timestamps in this format.
Type
A protocol buffer message type.
New usages of this message as an alternative to DescriptorProto are strongly
discouraged. This message does not reliability preserve all information
necessary to model the schema and preserve semantics. Instead make use of
FileDescriptorSet which preserves the necessary information.
UInt32Value
Wrapper message for `uint32`.
The JSON representation for `UInt32Value` is JSON number.
Not recommended for use in new APIs, but still useful for legacy APIs and
has no plan to be removed.
UInt64Value
Wrapper message for `uint64`.
The JSON representation for `UInt64Value` is JSON string.
Not recommended for use in new APIs, but still useful for legacy APIs and
has no plan to be removed.
Value
Represents a JSON value.
`Value` represents a dynamically typed value which can be either
null, a number, a string, a boolean, a recursive struct value, or a
list of values. A producer of value is expected to set one of these
variants. Absence of any variant is an invalid state.
Enumerations
NullValue
Represents a JSON `null`.
`NullValue` is a sentinel, using an enum with only one value to represent
the null value for the `Value` type union.
A field of type `NullValue` with any value other than `0` is considered
invalid. Most ProtoJSON serializers will emit a Value with a `null_value` set
as a JSON `null` regardless of the integer value, and so will round trip to
a `0` value.
Syntax
The syntax in which a protocol buffer element is defined.
Static Classes
AnyReflection
Holder for reflection information generated from google/protobuf/any.proto
ApiReflection
Holder for reflection information generated from google/protobuf/api.proto
DurationReflection
Holder for reflection information generated from google/protobuf/duration.proto
EmptyReflection
Holder for reflection information generated from google/protobuf/empty.proto
FieldMaskReflection
Holder for reflection information generated from google/protobuf/field_mask.proto
SourceContextReflection
Holder for reflection information generated from google/protobuf/source_context.proto
StructReflection
Holder for reflection information generated from google/protobuf/struct.proto
TimeExtensions
Extension methods on BCL time-related types, converting to protobuf types.
TimestampReflection
Holder for reflection information generated from google/protobuf/timestamp.proto
TypeReflection
Holder for reflection information generated from google/protobuf/type.proto
WrappersReflection
Holder for reflection information generated from google/protobuf/wrappers.proto