Załóżmy, że mam 2 komunikaty Protobuf, A i B. Ich ogólna struktura jest podobna, ale nie identyczna. Przenieśliśmy udostępnione rzeczy do oddzielnej wiadomości, którą nazwaliśmy "Wspólne". To działa pięknie.Dostęp do pola komunikatu Protobuf nieznanego typu w Pythonie
Jednakże mam teraz następujący problem: istnieje specjalny przypadek, w którym muszę przetworzyć zserializowaną wiadomość, ale nie wiem, czy jest to wiadomość typu A czy typu B. Mam działające rozwiązanie w C++ (pokazanym poniżej), ale nie udało mi się znaleźć sposobu na zrobienie tego samego w Pythonie.
Przykład:
// file: Common.proto
// contains some kind of shared struct that is used by all messages:
message Common {
...
}
// file: A.proto
import "Common.proto";
message A {
required int32 FormatVersion = 1;
optional bool SomeFlag [default = true] = 2;
optional Common CommonSettings = 3;
... A-specific Fields ...
}
// file: B.proto
import "Common.proto";
message B {
required int32 FormatVersion = 1;
optional bool SomeFlag [default = true] = 2;
optional Common CommonSettings = 3;
... B-specific Fields ...
}
Rozwiązanie Praca w C++
w C++ Używam odbicia API, aby uzyskać dostęp do pola CommonSettings takiego:
namespace gp = google::protobuf;
...
Common* getCommonBlock(gp::Message* paMessage)
{
gp::Message* paMessage = new gp::Message();
gp::FieldDescriptor* paFieldDescriptor = paMessage->GetDescriptor()->FindFieldByNumber(3);
gp::Reflection* paReflection = paMessage->GetReflection();
return dynamic_cast<Common&>(paReflection->GetMessage(*paMessage,paFieldDescriptor));
}
Metoda "getCommonBlock 'us es FindFieldByNumber(), aby uzyskać deskryptor pola, które próbuję zdobyć. Następnie wykorzystuje odbicie do pobrania rzeczywistych danych. getCommonBlock może przetwarzać wiadomości typu A, B lub dowolnego przyszłego typu, o ile pole wspólne pozostaje zlokalizowane w indeksie 3.
Moje pytanie brzmi: czy istnieje sposób na podobną rzecz Python? Patrzyłem na Protobuf documentation, ale nie mogłem znaleźć sposobu, aby to zrobić.
To by działało, gdybym miał instancję obj. Może powinienem trochę wyjaśnić swój problem: otrzymuję komunikat - w typowym stylu protobuf - jako serializowany obiekt typu blob (strumień binarnej pamięci). Jak utworzyć instancję obj z tego bez znajomości podstawowego typu komunikatu? – djf