NOT: Bu site kullanımdan kaldırılmıştır. Site 31 Ocak 2023'ten sonra kapatılacak ve trafik https://protobuf.dev adresindeki yeni siteye yönlendirilecek. Bu sırada, yalnızca protobuf.dev'de güncellemeler yapılacak.

mesaj.

#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 Üyeleri

Bu 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)

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öntemler

Bu 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
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). devamı...

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

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)

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)

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

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)

|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

Koşullar eşleştiğinde hızlı yol (ör.

belirleyici olmayan uint8* _DahiliSerialize(uint8* ptr) konst.


const Descriptor *
    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

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
Swap(Message * message1, Message * message2) const
İ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örleri

Bunlar, 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örleri

Tekrarlanan 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şturucular

Bunlar, 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

İ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

İ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

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

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

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

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

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

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

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

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

"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

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

"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

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

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

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

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

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

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

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

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

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

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

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

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)

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)

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.