#include <google/protobuf/message.h>
namespace google::protobuf
Basit olmayan protokol mesaj nesneleri tarafından uygulanan soyut arayüzü İleti'yi tanımlar.
Bu arayüzü manuel olarak uygulamak mümkün olsa da çoğu kullanıcı uygulama oluşturmak için protokol derleyiciyi kullanır.
Örnek kullanım:
Şu şekilde tanımlanmış bir mesajınız olduğunu varsayalım:
message Foo { optional string text = 1; repeated int32 numbers = 2; }
Ardından, yukarıdaki tanımdan bir sınıf oluşturmak için protokol derleyiciyi kullandıysanız şu şekilde kullanabilirsiniz:
std::string data; // Will store a serialized version of the message. { // Create a message and serialize it. Foo foo; foo.set_text("Hello World!"); foo.add_numbers(1); foo.add_numbers(5); foo.add_numbers(42); foo.SerializeToString(&data); } { // Parse the serialized message and check that it contains the // correct data. Foo foo; foo.ParseFromString(data); assert(foo.text() == "Hello World!"); assert(foo.numbers_size() == 3); assert(foo.numbers(0) == 1); assert(foo.numbers(1) == 5); assert(foo.numbers(2) == 42); } { // Same as the last block, but do it dynamically via the Message // reflection interface. Message* foo = new Foo; const Descriptor* descriptor = foo->GetDescriptor(); // Get the descriptors for the fields we're interested in and verify // their types. const FieldDescriptor* text_field = descriptor->FindFieldByName("text"); assert(text_field != nullptr); assert(text_field->type() == FieldDescriptor::TYPE_STRING); assert(text_field->label() == FieldDescriptor::LABEL_OPTIONAL); const FieldDescriptor* numbers_field = descriptor-> FindFieldByName("numbers"); assert(numbers_field != nullptr); assert(numbers_field->type() == FieldDescriptor::TYPE_INT32); assert(numbers_field->label() == FieldDescriptor::LABEL_REPEATED); // Parse the message. foo->ParseFromString(data); // Use the reflection interface to examine the contents. const Reflection* reflection = foo->GetReflection(); assert(reflection->GetString(*foo, text_field) == "Hello World!"); assert(reflection->FieldSize(*foo, numbers_field) == 3); assert(reflection->GetRepeatedInt32(*foo, numbers_field, 0) == 1); assert(reflection->GetRepeatedInt32(*foo, numbers_field, 1) == 5); assert(reflection->GetRepeatedInt32(*foo, numbers_field, 2) == 42); delete foo; }
Bu dosyadaki sınıflar | |
---|---|
Mesaj meta verilerini saklayacak bir kapsayıcı. | |
Protokol iletileri için soyut arayüz. | |
Bu arayüz, bir protokol mesajının alanlarına dinamik olarak erişmek ve bu alanları değiştirmek için kullanılabilecek yöntemler içerir. | |
Fabrikalar için mesaj nesneleri soyut arayüzü. |
Dosya ÜyeleriBu tanımlar herhangi bir sınıfın parçası değildir. | |
---|---|
template const T * | DynamicCastToGenerated(const Message * from) Bu mesaj, oluşturulan bir mesaj türüne aşağı çevirmeye çalışır. devamı... |
template T * | DynamicCastToGenerated(Message * from) |
template void | LinkMessageReflection() Bu mesajın yansımasının ikili değere bağlı olduğundan emin olmak için bu işlevi çağırın: more... |
const RepeatedPtrField< std::string > & | Reflection::GetRepeatedPtrFieldInternal< std::string >(const Message & message, const FieldDescriptor * field) const |
RepeatedPtrField< std::string > * | Reflection::MutableRepeatedPtrFieldInternal< std::string >(Message * message, const FieldDescriptor * field) const |
template const T * protobuf::DynamicCastToGenerated(
const Message * from)
const Message * from)
Bu mesaj, oluşturulan bir mesaj türüne aşağı çevirmeye çalışır.
Bu sınıf T örneği değilse nullptr değerini döndürür. Bu, RTTI devre dışı bırakılmış olsa bile çalışır.
Bu aynı zamanda, bağlayıcının bağlantı sırasında bunu kaldırmasını önleyecek güçlü bir T referansı oluşturur. Bu, oluşturulan fabrikaya yetki veren bir DynamicMessageFactory kullanıyorsanız önemli olabilir.
template void protobuf::LinkMessageReflection()
Bu mesajın yansımasının ikili programa bağlı olduğundan emin olmak için bu işlevi çağırın:
google::protobuf::LinkMessageReflection<FooMessage>();
Bu, aşağıdaki aramanın başarılı olmasını sağlayacaktır:
DescriptorPool::generated_pool()->FindMessageTypeByName("FooMessage");
Ayrıca yan etki olarak, aynı .proto dosyasındaki diğer öğelerin oluşturulan havuzda arama için de bulunacağını garanti eder.
Bu işlev iletiyi gerçekten kaydetmez, dolayısıyla aramadan önce çağrılması gerekmez. Ancak bu ikili programdan çıkarılamayan bir işlevde gerçekleşmelidir (yani ana nesneden erişilebilir olmalıdır).
En iyi uygulama, bu işlevi yansıtması gereken yere mümkün olduğunca yakın tanımlamaktır. Bu işlevin çağırması çok ucuzdur. Bu nedenle, en dar döngüler (x86-64'te iki "mov" talimatı derlenir) dışında çalışma zamanı ek yükü hakkında endişelenmenize gerek yoktur.
Yapı Meta Verileri
#include <google/protobuf/message.h>
namespace google::protobuf
Mesaj meta verilerini saklayacak bir kapsayıcı.
Üyeler | |
---|---|
const Descriptor * | descriptor |
const Reflection * | reflection |
class Message: herkese açık MessageLite
#include <google/protobuf/message.h>
namespace google::protobuf
Protokol iletileri için soyut arayüz.
Günlük işlemlerin çoğunu içeren MessageLite sayfasına da bakın. İleti'ye ise tanımlayıcılar ve yansımalar eklenir.
Bu sınıfın sanal olan ancak tamamen sanal olmayan yöntemlerin yansımaya dayalı varsayılan uygulamaları vardır. Hız için optimize edilmiş mesaj sınıfları bunların daha hızlı şekilde uygulanmasını geçersiz kılmak ister. Ancak, kod boyutu için optimize edilmiş sınıflar muhafaza etmekten memnun olabilir. descriptor.proto adresindeki Optimize_için optimizasyon seçeneğine bakın.
Kullanıcıların bu sınıftan türetilmemesi gerekir. Yalnızca protokolü derleyicinin ve dahili kitaplığın alt sınıflar oluşturmasına izin verilir.
Üyeler | |
---|---|
constexpr | Message() |
protected virtual Metadata | GetMetadata() const = 0 İleti'nin meta verilerini içeren bir yapı oluşturun. Bu yapı yukarıdaki GetDescriptor() ve GetReflection() parametrelerini uygulamak için kullanılır. |
protected explicit | Message(Arena * arena) |
protected static uint64 | GetInvariantPerBuild(uint64 salt) |
Temel İşlemler | |
virtual Message * | New() const = 0 Aynı türde yeni bir örnek oluştur. devamı... |
virtual Message * | New(Arena * arena) const Arenada yeni bir örnek oluşturun. devamı... |
virtual void | CopyFrom(const Message & from) Bu mesajı, verilen mesajın kopyasına dönüştürün. devamı... |
virtual void | MergeFrom(const Message & from) Belirtilen mesajdaki alanları bu mesajla birleştirin. devamı... |
void | CheckInitialized() const IsInitialized() işlevinin doğru değerini döndürdüğünü doğrular. devamı... |
void | FindInitializationErrors(std::vector< std::string > * errors) const Ayarlanmamış tüm zorunlu alanların listesini yavaşça oluşturun. devamı... |
virtual std::string | InitializationErrorString() const findInitializationErrors gibi ancak tüm dizeleri birleştirir ve virgüllerle ayırarak bunları döndürür. |
virtual void | DiscardUnknownFields() Bu iletideki tüm bilinmeyen alanlar ve yerleştirilmiş tüm iletiler temizlenir. devamı... |
virtual size_t | SpaceUsedLong() const Şu anda mesajın bellekte depolanması için kullanılan toplam bayt sayısını hesaplar (tahmini). devamı... |
int | SpaceUsed() const |
Hata Ayıklama ve Test Etme | |
std::string | DebugString() const Bu iletinin, hata ayıklama ve diğer amaçlar için kullanışlı, okunabilir bir biçimini oluşturur. |
std::string | ShortDebugString() const Örneğin, DebugString() yöntemi daha az boşluk içerir. |
std::string | Utf8DebugString() const DebugString() gibi, ancak UTF-8 bayt dizilerinden kaçının. |
void | PrintDebugString() const GDB'de kullanışlı işlev. DebugString() yöntemini stdout olarak yazdırır. |
Yansıtmaya dayalı yöntemlerBu yöntemler MessageLite'da tamamen sanaldır ancak Message bu makalede, yansımaya dayalı varsayılan uygulamalar sunar. | |
virtual std::string | GetTypeName() const Bu mesaj türünün adını alın, ör. "foo.bar.BazProto". |
virtual void | Clear() İletinin tüm alanlarını temizleyin ve varsayılan değerlerine ayarlayın. devamı... |
virtual bool | IsInitialized() const Zorunlu tüm alanların ayarlanıp ayarlanmadığını döndürür. devamı... |
virtual void | CheckTypeAndMergeFrom(const MessageLite & other) |other| bununla aynı sınıfsa MergeFrom() yöntemini çağırır. diğer... |
virtual const char * | _InternalParse(const char * ptr, internal::ParseContext * ctx) Yansıtıcı ayrıştırıcı. |
virtual size_t | ByteSizeLong() const İletinin serileştirilmiş boyutunu hesaplar. devamı... |
virtual uint8 * | _InternalSerialize(uint8 * ptr, io::EpsCopyOutputStream * stream) const Koşullar eşleştiğinde hızlı yol (ör. devamı... |
İçine bakış | |
const Descriptor * | GetDescriptor() const Bu mesajın türüyle ilgili bir Açıklayıcı'ya ait olmayan sahiplik işaretçisi alın. devamı... |
const Reflection * | GetReflection() const |
virtual Message * Message::New() const = 0
Aynı türde yeni bir örnek oluştur.
Sahiplik, arayana iletilir. (Bu, MessageLite içinde de tanımlanır ancak dönüş türü kovaryansları için burada tekrar tanımlanır.)
virtual Message * Message::New(
Arena * arena) const
Arena * arena) const
Arenada yeni bir örnek oluşturun.
Arena nullptr ise sahiplik arayana iletilir. Varsayılan uygulama, Arena geçişi sırasında API uyumluluğuna olanak tanır.
virtual void Message::CopyFrom(
const Message & from)
const Message & from)
Bu mesajı, verilen mesajın kopyasına dönüştürün.
Belirtilen mesaj aynı tanımlayıcıya sahip olmalıdır ancak aynı sınıf olması zorunlu değildir. Varsayılan olarak bu seçenek yalnızca "Clear(); MergeFrom(from);" olarak uygulanır.
virtual void Message::MergeFrom(
const Message & from)
const Message & from)
Belirtilen mesajdaki alanları bu mesajla birleştirin.
Birleştirilecek yerleştirilmiş iletiler hariç, gönderen alanında belirtildiği takdirde tekil alanların üzerine yazılır. Tekrarlanan alanlar birleştirilir. Belirtilen mesaj, bu mesajla aynı türde olmalıdır (yani tam olarak aynı sınıf).
void Message::CheckInitialized() const
IsInitialized() işlevinin doğru değerini döndürdüğünü doğrular.
Aksi takdirde GOOGLE_TEST-başarısız olur ve güzel bir hata mesajı görüntülenir.
void Message::FindInitializationErrors(
std::vector< std::string > * errors) const
std::vector< std::string > * errors) const
Ayarlanmamış tüm zorunlu alanların listesini yavaşça oluşturun.
Bu işlem, tamamen yansıma olarak uygulandığından IsInitialized() yönteminden çok daha yavaştır. Genellikle, IsInitialized() yöntemini çağırarak bir hatanın mevcut olup olmadığını belirlemediğiniz sürece bu parametreyi çağırmamalısınız.
virtual void Message::DiscardUnknownFields()
Bu iletideki tüm bilinmeyen alanlar ve yerleştirilmiş tüm iletiler temizlenir.
Normalde bir ileti ayrıştırılırken bilinmeyen etiket sayılarıyla karşılaşılırsa etiket ve değer, iletinin UnknownFieldSet'inde depolanır ve ardından ileti serileştirildiğinde tekrar yazılır. Bu sayede, iletileri yalnızca diğer sunuculara yönlendiren sunucular, henüz bilmedikleri yeni alan tanımları olan iletilerden geçebilir. Ancak bu davranışın güvenlik etkileri olabilir. Bu durumun önüne geçmek için, ayrıştırma işleminden sonra bu yöntemi çağırın.
Bilinmeyen alanlar hakkında daha fazla bilgi için Reflection::GetUnknownFields() makalesine bakın.
virtual size_t Message::SpaceUsedLong() const
Şu anda mesajın bellekte depolanması için kullanılan toplam bayt sayısını hesaplar (tahmini).
Varsayılan uygulama, Reflection nesnesinin SpaceUsed() yöntemini çağırır.
SpaceUsed(), yansıma kullanılarak uygulandığından (ByteSize() için oluşturulan kod uygulaması yerine) ByteSize() işlevinden belirgin şekilde daha yavaştır. ByteSize() gibi, CPU süresi de proto için tanımlanan alanların sayısı açısından doğrusaldır.
virtual void Message::Clear()
İletinin tüm alanlarını temizleyin ve varsayılan değerlerine ayarlayın.
Clear(), mesajın bir bölümünü tutmak için ayrılmış herhangi bir belleğin bir sonraki mesajı depolamak üzere tekrar gerekli olacağını varsayarak bellekte yer açılmasını önler. Bir İleti tarafından kullanılan belleği tamamen boşaltmak istiyorsanız ilgili belleği silmeniz gerekir.
virtual bool Message::IsInitialized() const
Zorunlu tüm alanların ayarlanıp ayarlanmadığını döndürür.
Proto3'ten itibaren zorunlu alanların artık mevcut olmadığını unutmayın.
virtual void Message::CheckTypeAndMergeFrom(
const MessageLite & other)
const MessageLite & other)
|other| bununla aynı sınıfsa MergeFrom() yöntemini çağırır.
Aksi takdirde, sonuçlar tanımlanmamıştır (büyük olasılıkla kilitlenme).
virtual size_t Message::ByteSizeLong() const
İletinin serileştirilmiş boyutunu hesaplar.
Bu, yerleştirilmiş tüm iletilerde yinelenen bir şekilde ByteSizeLong() yöntemini çağırır.
ByteSizeLong(), proto için tanımlanan alanların sayısı açısından genellikle doğrusaldır.
virtual uint8 * Message::_InternalSerialize(
uint8 * ptr,
io::EpsCopyOutputStream * stream) const
uint8 * ptr,
io::EpsCopyOutputStream * stream) const
Koşullar eşleştiğinde hızlı yol (ör.
belirleyici olmayan uint8* _DahiliSerialize(uint8* ptr) konst.
const Descriptor *
Message::GetDescriptor() const
Message::GetDescriptor() const
Bu mesajın türüyle ilgili bir Açıklayıcı'ya ait olmayan sahiplik işaretçisi alın.
Bu açıklama, iletinin hangi alanları, bu alanların türlerini vb. açıklar. Bu nesne, İleti'nin mülkü olarak kalır.
const Reflection *
Message::GetReflection() const
Message::GetReflection() const
Bu İleti için Yansıma arayüzünde, sahibi olmayan bir işaretçi kullanın. Bu işaretçi, İleti alanlarını dinamik olarak okumak ve değiştirmek için kullanılabilir (diğer bir deyişle, derleme sırasında ileti türünü bilmeden).
Bu nesne, İleti'nin mülkü olarak kalır.
sınıf yansıma
#include <google/protobuf/message.h>
namespace google::protobuf
Bu arayüz, bir protokol mesajının alanlarına dinamik olarak erişmek ve bu alanları değiştirmek için kullanılabilecek yöntemler içerir.
Anlamları, protokol derleyicinin oluşturduğu erişimcilere benzerdir.
Belirli bir İletiye ilişkin Reflection etiketini almak için Message::GetReflection() yöntemini çağırın.
Bu arayüz yalnızca verimlilik nedeniyle İleti'den ayrıdır; İleti uygulamalarının büyük bir çoğunluğu aynı Reflection (GeneratedMessageReflection, created_message.h dosyasında tanımlanmıştır) ve belirli bir sınıfın tüm İletileri, aynı Reflection nesnesini paylaşmalıdır (ancak ikinci gerçeğe güvenmemeniz gerekir).
Bu yöntemlerin yanlış şekilde kullanılmasının çeşitli yolları vardır. Örneğin, aşağıdaki koşullardan herhangi biri tanımlanmamış sonuçlara (muhtemelen onaylama hataları) yol açacaktır:
- FieldDescriptor, bu ileti türünün bir alanı değil.
- Aranan yöntem, alanın türü için uygun değil. FieldDescriptor::TYPE_* alanındaki her alan türü için geçerli olan yalnızca bir Get*() yöntemi, bir Set*() yöntemi ve bir Add*() yöntemi vardır. Hangi içeriğin açıkça belirtildiği açık olmalıdır (C++ cinsinden dizeler kullanılarak temsil edilen TYPE_BYTES hariç).
- Tekil alanlara yönelik Get*() veya Set*() yöntemi tekrarlanan bir alanda çağrılır.
- Tekrarlanmayan bir alanda Get Yineed*(), SetTekrared*() veya Add*() çağrılır.
- Herhangi bir yönteme aktarılan Message (İleti) nesnesi, bu Reflection nesnesi için doğru türde değil (ör. message.GetReflection() != yansıma).
İsteğe bağlı türden bir alan için neden soyut bir temsil olmadığını merak edebilirsiniz. Örneğin, neden "const Field&" döndüren bir "GetField()" yöntemi yok? "Field", "GetInt32Value()" gibi erişimcilerle birlikte kullanılan bir sınıftır. Sorun, birinin bu Alan nesnelerini ayırmakla ilgilenmesi gerektiğidir. Oluşturulan ileti sınıflarında, her alanı sarmalamak için ek bir nesneye alan ayırmanın, iletinin bellek ayak izini en azından iki katına çıkarması daha da kötü olur. Öte yandan nesneleri isteğe bağlı olarak ayırmak pahalı ve hafıza sızıntılarına yatkın olurdu. Bunun yerine bu düz arayüzü bulduk.
Üyeler | |
---|---|
const UnknownFieldSet & | GetUnknownFields(const Message & message) const İletiyle ilgili UnknownFieldSet öğesini alın. devamı... |
UnknownFieldSet * | MutableUnknownFields(Message * message) const İleti için UnknownFieldSet öğesine işaretlenebilir bir işaretçi alın. devamı... |
size_t | SpaceUsedLong(const Message & message) const Mesaj nesnesi tarafından kullanılan bellek miktarını tahmin edin. |
int | SpaceUsed(const Message & message) const |
bool | HasField(const Message & message, const FieldDescriptor * field) const Tekrarlanmayan belirli bir alanın ayarlanıp ayarlanmadığını kontrol edin. |
int | FieldSize(const Message & message, const FieldDescriptor * field) const Tekrarlanan bir alandaki öğelerin sayısını öğrenin. |
void | ClearField(Message * message, const FieldDescriptor * field) const Bir alanın değerini temizlemek için HasField() yanlış veya FieldSize() sıfır sonucunu döndürür. |
bool | HasOneof(const Message & message, const OneofDescriptor * oneof_descriptor) const Bunlardan birinin ayarlanıp ayarlanmadığını kontrol edin. devamı... |
void | ClearOneof(Message * message, const OneofDescriptor * oneof_descriptor) const |
const FieldDescriptor * | GetOneofFieldDescriptor(const Message & message, const OneofDescriptor * oneof_descriptor) const Şunlardan biri ayarlanmışsa alan tanımlayıcısını döndürür. Aksi takdirde nullptr. |
void | RemoveLast(Message * message, const FieldDescriptor * field) const Tekrarlanan alanın son öğesini kaldırır. devamı... |
PROTOBUF_FUTURE_MUST_USE_RESULT Message * | ReleaseLast(Message * message, const FieldDescriptor * field) const Tekrarlanan mesaj alanının son öğesini kaldırır ve işaretçiyi arayana döndürür. devamı... |
void | İki mesajın tüm içeriğini değiştirin. |
void | SwapFields(Message * message1, Message * message2, const std::vector< const FieldDescriptor * > & fields) const İki mesajın alan vektöründe listelenen alanları değiştirin. |
void | SwapElements(Message * message, const FieldDescriptor * field, int index1, int index2) const Yinelenen bir alanın iki öğesini değiştirin. |
void | ListFields(const Message & message, std::vector< const FieldDescriptor * > * output) const Bilinmeyen alanlar hariç, ancak ayrıştırıcı tarafından bilinen uzantı (ör.diğer...) hariç, iletinin şu anda ayarlanmış olan tüm alanlarını listeleyin. |
const RepeatedPtrField< Message > & | GetRepeatedPtrFieldInternal(const Message & message, const FieldDescriptor * field) const |
RepeatedPtrField< Message > * | MutableRepeatedPtrFieldInternal(Message * message, const FieldDescriptor * field) const |
Tek kişilik alan alıcılarıBunlar, tekrarlanmayan bir alanın değerini alır. Ayarlanmamış alanlar için varsayılan değeri döndürür. | |
int32 | GetInt32(const Message & message, const FieldDescriptor * field) const |
int64 | GetInt64(const Message & message, const FieldDescriptor * field) const |
uint32 | GetUInt32(const Message & message, const FieldDescriptor * field) const |
uint64 | GetUInt64(const Message & message, const FieldDescriptor * field) const |
float | GetFloat(const Message & message, const FieldDescriptor * field) const |
double | GetDouble(const Message & message, const FieldDescriptor * field) const |
bool | GetBool(const Message & message, const FieldDescriptor * field) const |
std::string | GetString(const Message & message, const FieldDescriptor * field) const |
const EnumValueDescriptor * | GetEnum(const Message & message, const FieldDescriptor * field) const |
int | GetEnumValue(const Message & message, const FieldDescriptor * field) const GetEnumValue(), enum alanının değerini EnumValueDescriptor* yerine bir tam sayı olarak döndürür. devamı... |
const Message & | GetMessage(const Message & message, const FieldDescriptor * field, MessageFactory * factory = nullptr) const "fabrika" parametresinin anlamı için MutableMessage() konusuna bakın. |
const std::string & | GetStringReference(const Message & message, const FieldDescriptor * field, std::string * scratch) const Mümkünse kopyalamadan bir dize değeri alın. devamı... |
Tekil alan alanı mutatörleriBunlar, yinelenmeyen bir alanın değerini değiştirir. | |
void | SetInt32(Message * message, const FieldDescriptor * field, int32 value) const |
void | SetInt64(Message * message, const FieldDescriptor * field, int64 value) const |
void | SetUInt32(Message * message, const FieldDescriptor * field, uint32 value) const |
void | SetUInt64(Message * message, const FieldDescriptor * field, uint64 value) const |
void | SetFloat(Message * message, const FieldDescriptor * field, float value) const |
void | SetDouble(Message * message, const FieldDescriptor * field, double value) const |
void | SetBool(Message * message, const FieldDescriptor * field, bool value) const |
void | SetString(Message * message, const FieldDescriptor * field, std::string value) const |
void | SetEnum(Message * message, const FieldDescriptor * field, const EnumValueDescriptor * value) const |
void | SetEnumValue(Message * message, const FieldDescriptor * field, int value) const Enum alanının değerini EnumValueDescriptor yerine bir tam sayı olarak belirleyin. devamı... |
Message * | MutableMessage(Message * message, const FieldDescriptor * field, MessageFactory * factory = nullptr) const Mesaj türü olan bir alana farklı işaretçiler alın. devamı... |
void | SetAllocatedMessage(Message * message, Message * sub_message, const FieldDescriptor * field) const "field" (alan) tarafından belirtilen mesajı, zaten ayrılmış olan sub_message nesnesiyle değiştirir ve sahipliği mesaja iletir. devamı... |
void | UnsafeArenaSetAllocatedMessage(Message * message, Message * sub_message, const FieldDescriptor * field) const SetAllocatedMessage ile benzerdir, ancak tüm dahili güvenlik ve sahiplik kontrollerinden çıkarılır. devamı... |
PROTOBUF_FUTURE_MUST_USE_RESULT Message * | ReleaseMessage(Message * message, const FieldDescriptor * field, MessageFactory * factory = nullptr) const "field" (alan) tarafından belirtilen mesajı serbest bırakır ve işaretçiyi döndürürse ReleaseMessage(), mesaj nesnesini (varsa) döndürür. devamı... |
Message * | UnsafeArenaReleaseMessage(Message * message, const FieldDescriptor * field, MessageFactory * factory = nullptr) const ReleaseMessage ile benzerdir, ancak tüm dahili güvenlik ve sahiplik kontrollerinden çıkarılır. devamı... |
Yinelenen saha alıcılarıBunlar, yinelenen alandaki bir öğenin değerini alır. | |
int32 | GetRepeatedInt32(const Message & message, const FieldDescriptor * field, int index) const |
int64 | GetRepeatedInt64(const Message & message, const FieldDescriptor * field, int index) const |
uint32 | GetRepeatedUInt32(const Message & message, const FieldDescriptor * field, int index) const |
uint64 | GetRepeatedUInt64(const Message & message, const FieldDescriptor * field, int index) const |
float | GetRepeatedFloat(const Message & message, const FieldDescriptor * field, int index) const |
double | GetRepeatedDouble(const Message & message, const FieldDescriptor * field, int index) const |
bool | GetRepeatedBool(const Message & message, const FieldDescriptor * field, int index) const |
std::string | GetRepeatedString(const Message & message, const FieldDescriptor * field, int index) const |
const EnumValueDescriptor * | GetRepeatedEnum(const Message & message, const FieldDescriptor * field, int index) const |
int | GetRepeatedEnumValue(const Message & message, const FieldDescriptor * field, int index) const GetTekraredEnumValue(), enumValue değerini bir EnumValueDescriptor* yerine bir tam sayı olarak döndürür. devamı... |
const Message & | GetRepeatedMessage(const Message & message, const FieldDescriptor * field, int index) const |
const std::string & | GetRepeatedStringReference(const Message & message, const FieldDescriptor * field, int index, std::string * scratch) const Yukarıdaki GetStringReference() bölümüne bakın. |
Tekrarlanan alan mutatörleriTekrarlanan alandaki bir öğenin değerini değiştirirler. | |
void | SetRepeatedInt32(Message * message, const FieldDescriptor * field, int index, int32 value) const |
void | SetRepeatedInt64(Message * message, const FieldDescriptor * field, int index, int64 value) const |
void | SetRepeatedUInt32(Message * message, const FieldDescriptor * field, int index, uint32 value) const |
void | SetRepeatedUInt64(Message * message, const FieldDescriptor * field, int index, uint64 value) const |
void | SetRepeatedFloat(Message * message, const FieldDescriptor * field, int index, float value) const |
void | SetRepeatedDouble(Message * message, const FieldDescriptor * field, int index, double value) const |
void | SetRepeatedBool(Message * message, const FieldDescriptor * field, int index, bool value) const |
void | SetRepeatedString(Message * message, const FieldDescriptor * field, int index, std::string value) const |
void | SetRepeatedEnum(Message * message, const FieldDescriptor * field, int index, const EnumValueDescriptor * value) const |
void | SetRepeatedEnumValue(Message * message, const FieldDescriptor * field, int index, int value) const Enum alanının değerini EnumValueDescriptor yerine bir tam sayı olarak belirleyin. devamı... |
Message * | MutableRepeatedMessage(Message * message, const FieldDescriptor * field, int index) const Mesaj türü ile, yinelenen bir alana ait öğe için değişebilir bir işaretçi edinin. |
Tekrarlanan alan oluşturucularBunlar, tekrarlanan alana bir öğe ekler. | |
void | AddInt32(Message * message, const FieldDescriptor * field, int32 value) const |
void | AddInt64(Message * message, const FieldDescriptor * field, int64 value) const |
void | AddUInt32(Message * message, const FieldDescriptor * field, uint32 value) const |
void | AddUInt64(Message * message, const FieldDescriptor * field, uint64 value) const |
void | AddFloat(Message * message, const FieldDescriptor * field, float value) const |
void | AddDouble(Message * message, const FieldDescriptor * field, double value) const |
void | AddBool(Message * message, const FieldDescriptor * field, bool value) const |
void | AddString(Message * message, const FieldDescriptor * field, std::string value) const |
void | AddEnum(Message * message, const FieldDescriptor * field, const EnumValueDescriptor * value) const |
void | AddEnumValue(Message * message, const FieldDescriptor * field, int value) const EnumValueDescriptor yerine, yinelenen bir enum alanına bir tam sayı değeri ekleyin. devamı... |
Message * | AddMessage(Message * message, const FieldDescriptor * field, MessageFactory * factory = nullptr) const "fabrika" parametresiyle ilgili yorumlar için MutableMessage() sayfasına bakın. |
void | AddAllocatedMessage(Message * message, const FieldDescriptor * field, Message * new_entry) const İletiye sahipliği aktaran "alan" tarafından belirtilen yinelenen alana zaten ayrılmış olan "yeni_giriş" nesnesini ekler. |
template RepeatedFieldRef< T > | GetRepeatedFieldRef(const Message & message, const FieldDescriptor * field) const Tekrarlanan temel alanı okumak için kullanılabilecek Yinelenen BirEDREF nesnesi edinin. devamı... |
template MutableRepeatedFieldRef< T > | GetMutableRepeatedFieldRef(Message * message, const FieldDescriptor * field) const Get YineedFieldRef() gibi, ancak temel tekrarlanan tekrarlanan alanı değiştirmek için de kullanılabilecek bir nesne döndürün. |
template const RepeatedField< T > & | GetRepeatedField(const Message & msg, const FieldDescriptor * d) const KULLANIMDAN KALDIRILDI. devamı... |
template RepeatedField< T > * | MutableRepeatedField(Message * msg, const FieldDescriptor * d) const KULLANIMDAN KALDIRILDI. devamı... |
template const RepeatedPtrField< T > & | GetRepeatedPtrField(const Message & msg, const FieldDescriptor * d) const KULLANIMDAN KALDIRILDI. devamı... |
template RepeatedPtrField< T > * | MutableRepeatedPtrField(Message * msg, const FieldDescriptor * d) const KULLANIMDAN KALDIRILDI. devamı... |
Uzantılar | |
const FieldDescriptor * | FindKnownExtensionByName(const std::string & name) const Tam nitelikli alan adına göre bu mesaj türünün bir uzantısını bulmaya çalışın. devamı... |
const FieldDescriptor * | FindKnownExtensionByNumber(int number) const Bu mesaj türünde, alan numarasına göre bir uzantı bulmaya çalışın. devamı... |
Özellik İşaretleri | |
bool | SupportsUnknownEnumValues() const Bu mesaj, numaralandırma alanlarında rastgele tam sayı değerlerinin depolanmasını destekliyor mu? |true|, GetEnumValue/SetEnumValue ve ilişkili tekrarlanan alan sürümleri rastgele tam sayı değerleri alırsa ve eski GetEnum() alıcı, herhangi bir tam sayı değeri olmayan bir EnumValueDescriptor oluşturur. devamı... |
MessageFactory * | GetMessageFactory() const Bu mesajla ilişkili MessageFactory değerini döndürür. devamı... |
const UnknownFieldSet &
Reflection::GetUnknownFields(
const Message & message) const
Reflection::GetUnknownFields(
const Message & message) const
İletiyle ilgili UnknownFieldSet öğesini alın.
Bu, İleti ayrıştırıldığında görülen ancak İleti'nin tanımına göre tanınmayan alanları içerir.
UnknownFieldSet *
Reflection::MutableUnknownFields(
Message * message) const
Reflection::MutableUnknownFields(
Message * message) const
İleti için UnknownFieldSet öğesine işaretlenebilir bir işaretçi alın.
Bu, İleti ayrıştırıldığında görülen ancak İleti'nin tanımına göre tanınmayan alanları içerir.
bool Reflection::HasOneof(
const Message & message,
const OneofDescriptor * oneof_descriptor) const
const Message & message,
const OneofDescriptor * oneof_descriptor) const
Bunlardan birinin ayarlanıp ayarlanmadığını kontrol edin.
Bunlardan birinde herhangi bir alan ayarlanmışsa true (doğru), değilse false (yanlış) değerini döndürür.
void Reflection::RemoveLast(
Message * message,
const FieldDescriptor * field) const
Message * message,
const FieldDescriptor * field) const
Tekrarlanan alanın son öğesini kaldırır.
O(n) olması gereken O(n^2) filtreleme döngüleri gibi verimsiz kullanımları davet ettiğinden, sonuncusu dışındaki herhangi bir öğeyi kaldırmanın bir yolunu sunmuyoruz. Sonun dışında bir öğe kaldırmak istiyorsanız bunu yapmanın en iyi yolu öğeleri yeniden düzenlemektir (Vary() işlevini kullanarak), kaldırılmasını istediğiniz öğenin sonunda olmasını sağlayın, ardından RemoveLast() çağrısı yapın.
PROTOBUF_FUTURE_MUST_USE_RESULT Message *
Reflection::ReleaseLast(
Message * message,
const FieldDescriptor * field) const
Reflection::ReleaseLast(
Message * message,
const FieldDescriptor * field) const
Tekrarlanan mesaj alanının son öğesini kaldırır ve işaretçiyi arayana döndürür.
Arayan, döndürülen işaretçinin sahipliğini alır.
void Reflection::ListFields(
const Message & message,
std::vector< const FieldDescriptor * > * output) const
const Message & message,
std::vector< const FieldDescriptor * > * output) const
Bilinmeyen alanlar hariç, ayrıştırıcı tarafından bilinen uzantı da dahil olmak üzere şu anda ayarlanmış olan iletinin tüm alanlarını listeleyin (ör.
derlenir). Tekil alanlar yalnızca HasField(field) true döndürülürse ve yinelenen alanlar yalnızca FieldSize(field) sıfır olmayan değerler döndürürse listelenir. Alanlar (hem normal alanlar hem de uzantı alanları) alan numarasına göre sıralanır. Ayrıştırıcının tanımadığı alanlara/uzantılara da erişmek için Reflection::GetUnknownFields() veya message.unknown_fields() işlevini kullanın.
int Reflection::GetEnumValue(
const Message & message,
const FieldDescriptor * field) const
const Message & message,
const FieldDescriptor * field) const
GetEnumValue(), enum alanının değerini EnumValueDescriptor* yerine bir tam sayı olarak döndürür.
Tam sayı değeri, bilinen bir değer tanımlayıcısına karşılık gelmiyorsa yeni bir değer tanımlayıcı oluşturulur. (Bu tür bir değer yalnızca bir ileti için yeni bilinmeyen numara semantiği etkinleştirildiğinde görünür.)
const std::string &
Reflection::GetStringReference(
const Message & message,
const FieldDescriptor * field,
std::string * scratch) const
Reflection::GetStringReference(
const Message & message,
const FieldDescriptor * field,
std::string * scratch) const
Mümkünse kopyalamadan bir dize değeri alın.
GetString(), dizenin bir kopyasını mutlaka döndürür. Bu, std::string zaten temel mesajda bir std::string nesnesinde depolandığında verimsiz olabilir. GetStringReference(), bu durumda ilgili std::string öğesini bir referans döndürür. Aksi takdirde, dizeyi *sermayeye kopyalayıp döndürür.
Not: Aşağıdakilere benzer bir kod yazmak son derece makul ve yararlıdır:
str = reflection->GetStringReference(message, field, &str);
Bu satır, alanın temel temsilinden bağımsız olarak dizenin yalnızca bir kopyasının oluşturulmasını sağlar. Bununla birlikte, yeni oluşturulmuş bir dize başlatılırken, aşağıdakiler gibi bir kod kullanmak kadar hızlı ve daha okunabilir olur:
std::string str = reflection->GetString(message, field);
void Reflection::SetEnumValue(
Message * message,
const FieldDescriptor * field,
int value) const
Message * message,
const FieldDescriptor * field,
int value) const
Enum alanının değerini EnumValueDescriptor yerine bir tam sayı olarak belirleyin.
Proto3'te bu, enum alanını belirtilen değere ayarlamak, proto2 içinse daha karmaşıktır. Değer bilinen bir enum değeriyse alan her zamanki gibi ayarlanır. Değer bilinmiyorsa bilinmeyen alan grubuna eklenir. Bunun, bilinmeyen enum değerlerini ayrıştırma davranışıyla eşleştiğini unutmayın. Bilinmeyen değerlere sahip birden fazla arama gerçekleştiğinde tüm aramalar, çağrı sırasına göre bilinmeyen alana eklenir.
Message * Reflection::MutableMessage(
Message * message,
const FieldDescriptor * field,
MessageFactory * factory = nullptr) const
Message * message,
const FieldDescriptor * field,
MessageFactory * factory = nullptr) const
Mesaj türü olan bir alana farklı işaretçiler alın.
Bir MessageFactory sağlanmışsa alt mesajın örneklerini oluşturmak için kullanılır; aksi takdirde, varsayılan fabrika kullanılır. Alan, kapsayıcı mesajın açıklayıcısıyla aynı havuzda bulunmayan bir uzantıysa (ör. yer paylaşımı havuzundaysa) bir MessageFactory sağlanmalıdır. Bunun ne anlama geldiğinden emin değilseniz muhtemelen bunun için endişelenmenize gerek yoktur (MessageFactory'yi sağlamayın). UYARI: FieldDescriptor derlenmiş bir uzantı içinse fabrika ayarları > GetPrototype(field->message_type()) Dinamik Mesaj ile aynı şekilde bu tür için derlenmiş sınıf örneği döndürmelidir.
void Reflection::SetAllocatedMessage(
Message * message,
Message * sub_message,
const FieldDescriptor * field) const
Message * message,
Message * sub_message,
const FieldDescriptor * field) const
"field" (alan) tarafından belirtilen mesajı, zaten ayrılmış olan sub_message nesnesiyle değiştirir ve sahipliği mesaja iletir.
Alanda bir mesaj varsa bu mesaj silinir. sub_message, nullptr ise alan temizlenir.
void Reflection::UnsafeArenaSetAllocatedMessage(
Message * message,
Message * sub_message,
const FieldDescriptor * field) const
Message * message,
Message * sub_message,
const FieldDescriptor * field) const
SetAllocatedMessage
ile benzerdir, ancak tüm dahili güvenlik ve sahiplik kontrollerinden çıkarılır.
Bu yöntem yalnızca nesneler aynı arenadaysa veya UnsafeArenaReleaseMessage
ile bir çağrıyla birlikte kullanılmalıdır.
PROTOBUF_FUTURE_MUST_USE_RESULT Message *
Reflection::ReleaseMessage(
Message * message,
const FieldDescriptor * field,
MessageFactory * factory = nullptr) const
Reflection::ReleaseMessage(
Message * message,
const FieldDescriptor * field,
MessageFactory * factory = nullptr) const
"field" (alan) tarafından belirtilen mesajı serbest bırakır ve işaretçiyi döndürürse ReleaseMessage(), mesaj nesnesini (varsa) döndürür.
Aksi takdirde, nullptr değerini döndürebilir veya döndürmeyebilir. Her durumda, dönüş değeri null değilse arayan, işaretçinin sahipliğini alır. Alan mevcutsa (HasField() doğruysa), döndürülen işaretçi MutableMessage() tarafından döndürülen işaretçiyle aynı olacaktır. Bu işlevin ClearField() ile aynı etkisi vardır.
Message * Reflection::UnsafeArenaReleaseMessage(
Message * message,
const FieldDescriptor * field,
MessageFactory * factory = nullptr) const
Message * message,
const FieldDescriptor * field,
MessageFactory * factory = nullptr) const
ReleaseMessage
ile benzerdir, ancak tüm dahili güvenlik ve sahiplik kontrollerinden çıkarılır.
Bu yöntem yalnızca nesneler aynı arenadaysa veya UnsafeArenaSetAllocatedMessage
ile bir çağrıyla birlikte kullanılmalıdır.
int Reflection::GetRepeatedEnumValue(
const Message & message,
const FieldDescriptor * field,
int index) const
const Message & message,
const FieldDescriptor * field,
int index) const
GetTekraredEnumValue(), enumValue değerini bir EnumValueDescriptor* yerine bir tam sayı olarak döndürür.
Tam sayı değeri, bilinen bir değer tanımlayıcısına karşılık gelmiyorsa yeni bir değer tanımlayıcı oluşturulur. (Bu tür bir değer yalnızca bir ileti için yeni bilinmeyen numara semantiği etkinleştirildiğinde görünür.)
void Reflection::SetRepeatedEnumValue(
Message * message,
const FieldDescriptor * field,
int index,
int value) const
Message * message,
const FieldDescriptor * field,
int index,
int value) const
Enum alanının değerini EnumValueDescriptor yerine bir tam sayı olarak belirleyin.
Proto3'te bu, enum alanını belirtilen değere ayarlamak, proto2 içinse daha karmaşıktır. Değer bilinen bir enum değeriyse alan her zamanki gibi ayarlanır. Değer bilinmiyorsa bilinmeyen alan grubuna eklenir. Bunun, bilinmeyen enum değerlerini ayrıştırma davranışıyla eşleştiğini unutmayın. Bilinmeyen değerlere sahip birden fazla arama gerçekleştiğinde tüm aramalar, çağrı sırasına göre bilinmeyen alana eklenir.
void Reflection::AddEnumValue(
Message * message,
const FieldDescriptor * field,
int value) const
Message * message,
const FieldDescriptor * field,
int value) const
EnumValueDescriptor yerine, yinelenen bir enum alanına bir tam sayı değeri ekleyin.
Proto3'te bu, enum alanını belirtilen değere ayarlamak, proto2 içinse daha karmaşıktır. Değer bilinen bir enum değeriyse alan her zamanki gibi ayarlanır. Değer bilinmiyorsa bilinmeyen alan grubuna eklenir. Bunun, bilinmeyen enum değerlerini ayrıştırma davranışıyla eşleştiğini unutmayın. Bilinmeyen değerlere sahip birden fazla arama gerçekleştiğinde tüm aramalar, çağrı sırasına göre bilinmeyen alana eklenir.
template RepeatedFieldRef< T >
Reflection::GetRepeatedFieldRef(
const Message & message,
const FieldDescriptor * field) const
Reflection::GetRepeatedFieldRef(
const Message & message,
const FieldDescriptor * field) const
Tekrarlanan temel alanı okumak için kullanılabilecek Yinelenen BirEDREF nesnesi edinin.
T parametresi parametresi, alanın cpp türüne göre ayarlanmalıdır. Aşağıdaki tabloda cpp türünden kabul edilebilir T'ye eşleme gösterilmektedir.
field->cpp_type() T CPPTYPE_INT32 int32 CPPTYPE_UINT32 uint32 CPPTYPE_INT64 int64 CPPTYPE_UINT64 uint64 CPPTYPE_DOUBLE double CPPTYPE_FLOAT float CPPTYPE_BOOL bool CPPTYPE_ENUM generated enum type or int32 CPPTYPE_STRING std::string CPPTYPE_MESSAGE generated message type or google::protobuf::Message
TekrarlananFieldRef nesnesi kopyalanabilir ve sonuç nesnesi, aynı iletideki aynı tekrarlanan alana işaret eder. Nesne, mesaj yok edilmediği sürece kullanılabilir.
Bu yöntemi kullanmak için kullanıcıların başlık satırına "reflection.h" dosyasını eklemesi gerektiğini unutmayın (YinelenenedFieldRef sınıf şablonlarını tanımlar).
template const RepeatedField< T > &
Reflection::GetRepeatedField(
const Message & msg,
const FieldDescriptor * d) const
Reflection::GetRepeatedField(
const Message & msg,
const FieldDescriptor * d) const
KULLANIMDAN KALDIRILDI.
Lütfen Get YineedFieldRef() işlevini kullanın.
T = kordon ve enum'lar hariç tüm protobuf skaler türleri.
template RepeatedField< T > *
Reflection::MutableRepeatedField(
Message * msg,
const FieldDescriptor * d) const
Reflection::MutableRepeatedField(
Message * msg,
const FieldDescriptor * d) const
KULLANIMDAN KALDIRILDI.
Lütfen GetMutableduplicateedFieldRef() işlevini kullanın.
T = kordon ve enum'lar hariç tüm protobuf skaler türleri.
template const RepeatedPtrField< T > &
Reflection::GetRepeatedPtrField(
const Message & msg,
const FieldDescriptor * d) const
Reflection::GetRepeatedPtrField(
const Message & msg,
const FieldDescriptor * d) const
KULLANIMDAN KALDIRILDI.
Lütfen Get YineedFieldRef() işlevini kullanın.
T = std::string, google::protobuf::internal::StringPieceField için
google::protobuf::Message & descendants.
template RepeatedPtrField< T > *
Reflection::MutableRepeatedPtrField(
Message * msg,
const FieldDescriptor * d) const
Reflection::MutableRepeatedPtrField(
Message * msg,
const FieldDescriptor * d) const
KULLANIMDAN KALDIRILDI.
Lütfen GetMutableduplicateedFieldRef() işlevini kullanın.
T = std::string, google::protobuf::internal::StringPieceField için
google::protobuf::Message & descendants.
const FieldDescriptor *
Reflection::FindKnownExtensionByName(
const std::string & name) const
Reflection::FindKnownExtensionByName(
const std::string & name) const
Tam nitelikli alan adına göre bu mesaj türünün bir uzantısını bulmaya çalışın.
Bu ada veya numaraya ilişkin bir uzantı bilinmiyorsa nullptr değerini döndürür.
const FieldDescriptor *
Reflection::FindKnownExtensionByNumber(
int number) const
Reflection::FindKnownExtensionByNumber(
int number) const
Bu mesaj türünde, alan numarasına göre bir uzantı bulmaya çalışın.
Bu ada veya numaraya ilişkin bir uzantı bilinmiyorsa nullptr değerini döndürür.
bool Reflection::SupportsUnknownEnumValues() const
Bu mesaj, numaralandırma alanlarında rastgele tam sayı değerlerinin depolanmasını destekliyor mu? |true|, GetEnumValue/SetEnumValue ve ilişkili tekrarlanan alan sürümleri rastgele tam sayı değerleri alırsa ve eski GetEnum() alıcı, herhangi bir tam sayı değeri olmayan bir EnumValueDescriptor oluşturur.
|false| ise tam sayı tabanlı seter'lar üzerinden bilinmeyen bir numaralandırma değeri belirlemek, tanımlanmamış davranışlara (uygulamada GOOGLE_DCheck-fails) neden olur.
Numaralandırma alanlı iletileri işlemek için yansımayı kullanan genel kod, tam sayı tabanlı seter kullanmadan önce bu bayrağı işaretlemeli ve uyumlu bir değere düşürmeli veya değilse UnknownFieldSet'i kullanmalıdır. Örneğin:
int new_value = GetValueFromApplicationLogic(); if (reflection->SupportsUnknownEnumValues()) { reflection->SetEnumValue(message, field, new_value); } else { if (field_descriptor->enum_type()-> FindValueByNumber(new_value) != nullptr) { reflection->SetEnumValue(message, field, new_value); } else if (emit_unknown_enum_values) { reflection->MutableUnknownFields(message)->AddVarint( field->number(), new_value); } else { // convert value to a compatible/default value. new_value = CompatibleDowngrade(new_value); reflection->SetEnumValue(message, field, new_value); } }
MessageFactory * Reflection::GetMessageFactory() const
Bu mesajla ilişkili MessageFactory değerini döndürür.
Bu, bir mesajın oluşturulan bir ileti olup olmadığını belirleme konusunda yararlı olabilir. Örneğin:
if (message->GetReflection()->GetMessageFactory() == google::protobuf::MessageFactory::generated_factory()) { // This is a generated message. }
Bu tür daha fazla mesaj oluşturmak için de kullanılabilir ancak Message::New() bunu yapmanın daha kolay bir yoludur.
MessageFactory sınıfı
#include <google/protobuf/message.h>
namespace google::protobuf
Fabrikalar için mesaj nesneleri soyut arayüzü.
Bilinen alt sınıflar:
Üyeler | |
---|---|
| MessageFactory() |
virtual | ~MessageFactory() |
virtual const Message * | GetPrototype(const Descriptor * type) = 0 Açıklayıcı girildiğinde, bu türdeki varsayılan (prototip) Mesaj oluşturulur veya oluşturulur. devamı... |
static MessageFactory * | generated_factory() Oluşturulan tüm derlenmiş mesajları destekleyen bir MessageFactory alır. devamı... |
static void | InternalRegisterGeneratedFile(const google::protobuf::internal::DescriptorTable * table) Yalnızca dahili kullanım için: statik_ilk kullanıma hazır zamanda .proto dosyası oluşturulur. devamı... |
static void | InternalRegisterGeneratedMessage(const Descriptor * descriptor, const Message * prototype) Yalnızca dahili kullanım için: Bir mesaj türü kaydeder. devamı... |
virtual const Message * MessageFactory::GetPrototype(
const Descriptor * type) = 0
const Descriptor * type) = 0
Açıklayıcı girildiğinde, bu türdeki varsayılan (prototip) Mesaj oluşturulur veya oluşturulur.
Ardından, söz konusu türde yenilenebilir bir mesaj oluşturmak için bu mesajın New() yöntemini çağırabilirsiniz.
Bu yöntem aynı Açıklayıcı ile iki kez çağrıldığında aynı nesne döndürülür. Döndürülen nesne fabrikada kalır. Ayrıca, prototipin New() yöntemini çağırarak oluşturulan tüm nesneler, prototiple bazı verileri paylaşır. Bu nedenle, MessageFactory yok edilmeden önce bunların yok edilmesi gerekir.
Belirtilen tanımlayıcı, döndürülen iletiyi ve dolayısıyla MessageFactory'yi aşmalıdır.
Bazı uygulamalar tüm türleri desteklemez. İletilen tanımlayıcı desteklenmiyorsa GetPrototype() nullptr değerini döndürür.
Uygulamaya bağlı olarak bu yöntem ileti dizisi açısından güvenli olabilir veya olmayabilir. Her uygulamanın kendi dereceli ileti dizisi güvenliğini belgelendirmesi gerekir.
static MessageFactory * MessageFactory::generated_factory()
Oluşturulan tüm derlenmiş mesajları destekleyen bir MessageFactory alır.
Diğer bir deyişle, derlenmiş FooMessage türleri için aşağıdakiler geçerlidir:
MessageFactory::generated_factory()->GetPrototype( FooMessage::descriptor()) == FooMessage::default_instance()
Bu fabrika, DescriptorPool::generate_pool() işlevinde bulunan tüm türleri destekler. Başka bir havuzdan tanımlayıcı verilirse GetPrototype() nullptr değerini döndürür. (Descriptor->file()->pool() == DescriptorPool::generate_pool() işlevini kontrol ederek, oluşturulan bir iletinin açıklayıcısı olup olmadığını da kontrol edebilirsiniz.)
Bu fabrika, %100 güvenlidir ve GetPrototype() yöntemini kullanarak paylaşılan verileri değiştirmez.
Bu fabrika tekil bir markadır. Arayan, nesneyi silmemelidir.
static void MessageFactory::InternalRegisterGeneratedFile(
const google::protobuf::internal::DescriptorTable * table)
const google::protobuf::internal::DescriptorTable * table)
Yalnızca dahili kullanım için: statik_ilk kullanıma hazır zamanda .proto dosyası oluşturulur.
GetPrototype() bu dosyadaki bir tanımlayıcıyla ilk kez çağrıldığında, parametre olarak dosya adı ile birlikte |register_messages| çağrılır. Dosyadaki her mesaj türünü kaydetmek için DahiliEnrollmentGeneratedMessage() yöntemini (aşağıda) çağırmalıdır. Tanımlayıcılar geç oluşturulduğu için bu tuhaf mekanizma gereklidir. Bu nedenle, tanımlayıcının var olduğunu öğrenene kadar türleri tanımlayıcıya göre kaydedemeyiz. |filename| kalıcı bir dize olmalıdır.
static void MessageFactory::InternalRegisterGeneratedMessage(
const Descriptor * descriptor,
const Message * prototype)
const Descriptor * descriptor,
const Message * prototype)
Yalnızca dahili kullanım için: Bir mesaj türü kaydeder.
Yalnızca yukarıdaki InternalEnrollmentGeneratedFile() işlevine kayıtlı işlevler tarafından çağrılır.