Ihre Behauptung, dass "die C++- und die Java-API dasselbe tun sollen", ist unbegründet. Sie sind nicht so dokumentiert, dass sie dasselbe tun. Jede Ausgabesprache kann eine andere Interpretation der in der .proto-Datei beschriebenen Struktur erzeugen. Das hat den Vorteil, dass die Ergebnisse in jeder Sprache idiomatisch sind für diese Sprache . Es minimiert das Gefühl, dass Sie, sagen wir, "Java in C++ schreiben". Das wäre definitiv die Art und Weise Ich würde Es wäre schön, wenn es für jede Nachrichtenklasse eine eigene Builder-Klasse gäbe.
Für ein ganzzahliges Feld foo
die C++-Ausgabe von protoc wird eine Methode enthalten void set_foo(int32 value)
in der Klasse für die angegebene Nachricht.
Die Java-Ausgabe erzeugt stattdessen zwei Klassen. Die eine stellt direkt die Nachricht dar, hat aber nur Getter für das Feld. Die andere Klasse ist die Builder-Klasse und hat nur Setter für das Feld.
Die Python-Ausgabe ist immer noch anders. Die erzeugte Klasse enthält ein Feld, das Sie direkt manipulieren können. Ich gehe davon aus, dass die Plug-ins für C, Haskell und Ruby ebenfalls recht unterschiedlich sind. Solange sie alle eine Struktur darstellen können, die in äquivalente Bits auf der Leitung übersetzt werden kann, haben sie ihre Aufgabe erfüllt. Denken Sie daran, dass es sich um "Protokollpuffer" und nicht um "API-Puffer" handelt.
Der Quellcode für das C++-Plugin wird mit dem protoc Vertrieb. Wenn Sie die Rückgabeart für die set_foo
Funktion, können Sie das gerne tun. Normalerweise vermeide ich Antworten, die auf "Es ist Open Source, also kann es jeder ändern" hinauslaufen, weil es normalerweise nicht hilfreich ist, jemandem zu empfehlen, ein völlig neues Projekt gut genug zu lernen, um größere Änderungen vorzunehmen, nur um ein Problem zu lösen. Ich erwarte jedoch nicht, dass es in diesem Fall sehr schwer sein wird. Das Schwierigste wäre, den Abschnitt des Codes zu finden, der Setter für Felder erzeugt. Sobald Sie diesen gefunden haben, ist die Änderung, die Sie benötigen, wahrscheinlich einfach. Ändern Sie den Rückgabetyp, und fügen Sie ein return *this
Anweisung an das Ende des generierten Codes. Sie sollten dann in der Lage sein, Code in der Art zu schreiben, wie er in Hrnt's Antwort .