protobufAny
Any
شامل یک پیام protocol buffer سریالایز شده دلخواه همراه با
URL که نوع پیام سریالایز شده را توضیح میدهد.
کتابخانه Protobuf پشتیبانی برای pack/unpack مقادیر Any را به شکل توابع کاربردی یا متدهای اضافی تولید شده نوع Any ارائه میدهد.
مثال 1: Pack و unpack پیام در C++.
Foo foo = ...; Any any; any.PackFrom(foo); ... if (any.UnpackTo(&foo)) { ... }
مثال 2: Pack و unpack پیام در Java.
Foo foo = ...; Any any = Any.pack(foo); ... if (any.is(Foo.class)) { foo = any.unpack(Foo.class); }
مثال 3: Pack و unpack پیام در Python.
foo = Foo(...) any = Any() any.Pack(foo) ... if any.Is(Foo.DESCRIPTOR): any.Unpack(foo) ...
مثال 4: Pack و unpack پیام در Go
foo := &pb.Foo{...} any, err := anypb.New(foo) if err != nil { ... } ... foo := &pb.Foo{} if err := any.UnmarshalTo(foo); err != nil { ... }
متدهای pack ارائه شده توسط کتابخانه protobuf به طور پیشفرض از 'type.googleapis.com/full.type.name' به عنوان URL نوع استفاده میکنند و متدهای unpack فقط از نام نوع کاملاً واجد شرایط پس از آخرین '/' در URL نوع استفاده میکنند، مثلاً "foo.bar.com/x/y.z" نام نوع "y.z" را ایجاد میکند.
JSON
نمایش JSON یک مقدار Any
از نمایش معمولی
پیام deserialize شده و جاسازی شده، با یک
فیلد اضافی @type
که شامل URL نوع است، استفاده میکند. مثال:
package google.profile; message Person { string first_name = 1; string last_name = 2; }
{ "@type": "type.googleapis.com/google.profile.Person", "firstName": <string>, "lastName": <string> }
اگر نوع پیام جاسازی شده شناخته شده باشد و نمایش JSON سفارشی
داشته باشد، آن نمایش با افزودن فیلد
value
که JSON سفارشی را علاوه بر فیلد @type
نگه میدارد، جاسازی میشود. مثال (برای پیام [google.protobuf.Duration][]):
{ "@type": "type.googleapis.com/google.protobuf.Duration", "value": "1.212s" }
یک URL/نام منبع که نوع پیام protocol buffer سریالایز شده را به طور منحصر به فرد شناسایی میکند. این رشته باید حداقل
یک کاراکتر "/" داشته باشد. آخرین بخش مسیر URL باید نام کاملاً واجد شرایط نوع را نمایش دهد (مانند
path/google.protobuf.Duration
). نام باید در فرم کانونیکال باشد
(مثلاً، "." ابتدایی پذیرفته نیست).
در عمل، تیمها معمولاً تمام انواعی که انتظار دارند در زمینه Any استفاده شود را به صورت پیشکامپایل در باینری قرار میدهند. با این حال، برای URL هایی که از
طرح http
، https
یا بدون طرح استفاده میکنند، میتوان به طور اختیاری یک سرور نوع تنظیم کرد که URL های نوع را به تعاریف پیام نگاشت میکند:
- اگر طرحی ارائه نشود،
https
فرض میشود. - یک HTTP GET روی URL باید مقدار [google.protobuf.Type][] را به فرمت باینری ارائه دهد، یا خطا تولید کند.
- برنامهها مجاز هستند نتایج جستجو را بر اساس URL کش کنند، یا آنها را در باینری پیشکامپایل کنند تا از هر جستجویی جلوگیری کنند. بنابراین، سازگاری باینری باید در تغییرات انواع حفظ شود. (از نامهای نوع نسخهدار برای مدیریت تغییرات شکستآور استفاده کنید.)
توجه: این قابلیت در حال حاضر در نسخه رسمی protobuf در دسترس نیست، و برای URL های نوع که با type.googleapis.com شروع میشوند استفاده نمیشود.
طرحهای غیر از http
، https
(یا طرح خالی) ممکن است
با معناشناسی خاص پیادهسازی استفاده شوند.
Any
شامل یک پیام protocol buffer سریالایز شده دلخواه همراه با
URL که نوع پیام سریالایز شده را توضیح میدهد.
کتابخانه Protobuf پشتیبانی برای pack/unpack مقادیر Any را به شکل توابع کاربردی یا متدهای اضافی تولید شده نوع Any ارائه میدهد.
مثال 1: Pack و unpack پیام در C++.
Foo foo = ...;
Any any;
any.PackFrom(foo);
...
if (any.UnpackTo(&foo)) {
...
}
مثال 2: Pack و unpack پیام در Java.
Foo foo = ...;
Any any = Any.pack(foo);
...
if (any.is(Foo.class)) {
foo = any.unpack(Foo.class);
}
مثال 3: Pack و unpack پیام در Python.
foo = Foo(...)
any = Any()
any.Pack(foo)
...
if any.Is(Foo.DESCRIPTOR):
any.Unpack(foo)
...
مثال 4: Pack و unpack پیام در Go
foo := &pb.Foo{...}
any, err := anypb.New(foo)
if err != nil {
...
}
...
foo := &pb.Foo{}
if err := any.UnmarshalTo(foo); err != nil {
...
}
متدهای pack ارائه شده توسط کتابخانه protobuf به طور پیشفرض از 'type.googleapis.com/full.type.name' به عنوان URL نوع استفاده میکنند و متدهای unpack فقط از نام نوع کاملاً واجد شرایط پس از آخرین '/' در URL نوع استفاده میکنند، مثلاً "foo.bar.com/x/y.z" نام نوع "y.z" را ایجاد میکند.
JSON
نمایش JSON یک مقدار Any
از نمایش معمولی
پیام deserialize شده و جاسازی شده، با یک
فیلد اضافی @type
که شامل URL نوع است، استفاده میکند. مثال:
package google.profile;
message Person {
string first_name = 1;
string last_name = 2;
}
{
"@type": "type.googleapis.com/google.profile.Person",
"firstName": <string>,
"lastName": <string>
}
اگر نوع پیام جاسازی شده شناخته شده باشد و نمایش JSON سفارشی
داشته باشد، آن نمایش با افزودن فیلد
value
که JSON سفارشی را علاوه بر فیلد @type
نگه میدارد، جاسازی میشود. مثال (برای پیام [google.protobuf.Duration][]):
{
"@type": "type.googleapis.com/google.protobuf.Duration",
"value": "1.212s"
}
{
"@type": "string"
}