Wie geht man mit der Vererbung in Google Protocol Buffers 3.0 um?
Java-äquivalenter Code:
public class Bar {
String name;
}
public class Foo extends Bar {
String id;
}
Was wäre ein Proto-äquivalenter Code?
message Bar {
string name = 1;
}
message Foo {
string id = 2;
}
Protocol Buffers unterstützt keine Vererbung. Ziehen Sie stattdessen die Verwendung von Komposition in Betracht:
message Foo {
Bar bar = 1;
string id = 2;
}
Allerdings gibt es einen Trick, den Sie verwenden können, der wie Vererbung ist – aber ein hässlicher Hack ist, also sollten Sie ihn nur mit Vorsicht verwenden. Wenn Sie Ihre Nachrichtentypen wie folgt definieren:
message Bar {
string name = 1;
}
message Foo {
string name = 1;
string id = 2;
}
Diese beiden Arten sind kompatibelWeil Foo
enthält eine Obermenge der Felder von Bar
. Das heißt, wenn Sie eine verschlüsselte Nachricht eines Typs haben, können Sie sie als den anderen Typ entschlüsseln. Wenn Sie versuchen, a zu entschlüsseln Bar
als Typ Foo
das Feld id
wird nicht gesetzt (und erhält seinen Standardwert). Wenn Sie a entschlüsseln Foo
als Typ Bar
das Feld id
wird ignoriert. (Beachten Sie, dass dies die gleichen Regeln sind, die beim Hinzufügen neuer Felder zu einem Typ im Laufe der Zeit gelten.)
Sie können dies möglicherweise verwenden, um so etwas wie Vererbung zu implementieren, indem Sie mehrere Typen haben, die alle eine Kopie der Felder der “Superklasse” enthalten. Es gibt jedoch ein paar große Probleme mit diesem Ansatz:
- Konvertieren eines Nachrichtenobjekts vom Typ
Foo
tippen Bar
, müssen Sie serialisieren und erneut analysieren; Sie können nicht einfach werfen. Dies kann ineffizient sein.
- Es ist sehr schwierig, der Oberklasse neue Felder hinzuzufügen, da Sie sicherstellen müssen, dass das Feld jeder Unterklasse hinzugefügt wird, und sicherstellen müssen, dass dies keine Feldnummernkonflikte erzeugt.
Siehe die Grundlagen des Protokollpuffers Lernprogramm:
Suchen Sie jedoch nicht nach Möglichkeiten, die der Klassenvererbung ähneln – Protokollpuffer tun das nicht.
Die Vererbung wird in Protokollpuffern nicht unterstützt. siehe dies http://stackoverflow.com/questions/29263507/…
– Yousaf
20. Dezember 2016 um 13:21 Uhr
Mögliches Duplikat von Extending Protobuf Messages
– iammilind
31. August 2018 um 6:46 Uhr