Wie Sie dynamisch erstellen Sie eine neue protobuf aus einer Reihe von bereits definierten Deskriptoren?

Auf meinem server, wir erhalten Selbst Beschrieben-Nachrichten (wie definiert hier... was btw gar nicht so einfach, da es keine "gute" Beispiele in c++).

Gehe ich an dieser Stelle keine Ausgabe erstellen Nachrichten von diesen selbst beschrieben, diejenigen. Ich kann die FileDescriptorSet, gehen Sie durch die einzelnen FileDescriptorProto, indem jede eine DescriptorPool (mit BuildFile, die gibt mir auch jedes definierte Filedescriptors).

Ich von hier aus können Sie erstellen, die Nachrichten, die definiert wurden in der FileDescriptorSet mit einem DynamicMessageFactory instanziert mit der DP und den Aufruf GetPrototype (das ist sehr einfach zu tun, wie unsere SelfDescribedMessage erforderlich, die Nachrichten full_name() und damit wir anrufen können, die FindMessageTypeByName Methode der DP, was uns die richtig codierte Nachricht Prototyp).

Die Frage ist, wie kann ich jeweils bereits angegebenen Deskriptor oder message und dynamisch ERSTELLEN eines 'master' - Nachricht, die enthält alle definierten Meldungen werden als verschachtelte Nachrichten. Dies würde in Erster Linie verwendet werden für die Speicherung der aktuellen Zustand der Meldungen. Derzeit sind wir Umgang mit diesem nur durch Instanziierung eines Typs der Nachricht des Servers zu halten, einen zentralen Staat über verschiedene Programme). Aber wenn wir wollen 'save' der aktuelle Stand, sind wir gezwungen, Sie zu streamen auf der Festplatte definiert hier. Sie strömten eine Nachricht zu einer Zeit (mit einer Größe Präfix). Wir würden gerne EINE Botschaft (eine, Sie alle zu Knechten) statt der stetigen Strom von separaten Nachrichten. Dies kann verwendet werden, für andere Dinge, wenn es einmal geklappt (Netzwerk-basiertes shared-Zustand mit optimierten und einfachen Serialisierung)

Da haben wir schon das Kreuz-verbundene und definierte Deskriptoren, würde man denken es wäre eine einfache Möglichkeit zu bauen "neuen" Nachrichten von jenen, die bereits umrissene. Bisher hat die Lösung angespielt uns. Wir haben versucht unsere eigene DescriptorProto und hinzufügen neuer Felder des Typs " aus unseren bereits definierten Deskriptoren, die aber verloren gegangen (noch nicht tief getaucht in dieses eine noch). Wir haben uns auch angeschaut, evtl. mit Zusatz als Erweiterungen (unbekannte zu dieser Zeit, wie dies zu tun). Müssen wir unsere eigene DescriptorDatabase (auch unbekannt zu dieser Zeit, wie dies zu tun)?

Irgendwelche Erkenntnisse?


Verbunden Beispiel Quelle auf BitBucket.


Ich hoffe diese Erklärung hilft.

Ich bin versucht, dynamisch zu erstellen einer Nachricht aus einer Reihe von bereits definierten Nachrichten. Die Reihe von bereits definierten Nachrichten werden erstellt, mithilfe der "self-described" - Methode erklärt(kurz) in die offizielle c++ - protobuf-tutorial (also diese Nachrichten nicht in kompilierter form). Das neu Nachricht definiert werden müssen, die zur Laufzeit angelegt.

Haben versucht, mit den gerade Deskriptoren für jede Nachricht und versucht, bauen eine FileDescriptorProto. Habe versucht, Blick auf die DatabaseDescriptor Methoden. Beide ohne Glück. Zurzeit versucht, diese definiert Nachrichten als Erweiterung zu einer anderen Nachricht (auch wenn zur compile-Zeit die Nachrichten, und Ihre 'Deskriptor-set" wurden nicht klassifiziert, da die Verlängerung nichts), die ist, wo der Beispiel-code beginnt.

  • wow... nicht einmal einen Kommentar... Hier, wo ich bin so weit. Dies ist die einzige, die ich über die öffentlichen Quelle ... es offensichtlich nicht kompilieren jetzt (alle gut bis sehr Ende, wo die ExtensionSet zuerst erstellt wird)... Versuchen, gehen Sie die Erweiterungen route in dem moment, als die beiden anderen haben mich im Stich gelassen als der noch. goo.gl/VJhnk
  • Das Problem, das ich habe ist im moment bei der Initialisierung des Erweiterungs-Bezeichner. Ich brauche ein Klasse Punkt für die MessageTypeTraits zu, dass der eine, die beschreibt die Art der Meldung (vielleicht haben meine eigenen templateing Magie?) aber sind erfolglos gewesen, wie der noch...
  • Ehrlich gesagt, ich lese deine Frage 3 mal, und immer noch nicht zu verstehen, was Sie beschreiben. Ich denke, das passiert, die meisten Leser, ist, warum Sie nicht bekommen eine Antwort. Sie brauchen, um zu vereinfachen Zeug. Auch, es fühlt sich wirklich wie Sie beim Aufbau etwas kompliziert, wo eine viel einfachere Lösung möglich ist.
  • Die Beschreibung ist im Grunde so einfach, wie es bekommen kann. Die jetzt enthalten ist auch eine sehr abgespeckte version von dem, was ich beschreibe. Ich bin sicherlich daran interessiert, Vorschläge in Richtung auf eine einfachere Lösung.
  • sobald Sie deserialisiert eine Nachricht, die mit dem Prototyp, was kann man sinnvoll tun? Eine große if-else if-else if-Konstruktion, um herauszufinden, wie Sie warf es wieder auf den ursprünglichen Typ?
  • wir es nutzen, um Staat über verschiedene Programme (shared IPC von Arten). Dies ermöglicht uns die Unterstützung einer beliebigen Anzahl von client-Programme, ohne zu wissen, die Speicher-Struktur, bevor die hand. Jeder client 'Register' - Nachrichten, die Sie möchten, zu empfangen/senden, und wir aktualisieren den aktuellen Status von client-Programme. Das Problem ist, wenn wir mit der Serialisierung der Nachrichten, die für die Speicherung oder Analyse von Ihnen für den staatlichen Abruf zwischen den Sitzungen. Wir sind in der Lage, es zu tun Seriell wie wir derzeit sind, müssen nur um es zu verbessern, um eine Nachricht definiert.
  • Ich würde denken, dein Erster Ansatz ("die Entwicklung unserer eigenen DescriptorProto und hinzufügen neuer Felder des Typs "aus unseren bereits definierten Deskriptoren") wäre das einfachste. Können die DescriptorPool oder die DynamicMessageFactory geben Sie eine Liste von Nachrichten?
  • dies ist die Methode, die ich versuche zu tun, zuerst aber, glaube ich, fehlt ein kleiner Schlüssel Stück... Alle code-Vorschläge?
  • Ich fragte, Frage auf google groups in Bezug auf dieses problem. Wenn jemand ein paar Beispiel-code innerhalb der nächsten 22 Stunden ist die vorgeschlagene Lösung, ich werde Auszeichnung das Kopfgeld auf diese person. Die Antwort, die unten ist, ist nicht hilfreich.
  • Können Sie mir eine Anleitung wie man-selbst-beschreiben-Nachrichten oder erklären Sie mir, wie-um eine FileDescriptorSet zum abrufen der Kommentare die für eine Nachricht von einem .proto-Datei? Ich bekomme es nicht nach dem Lesen der offiziellen Dokument. Ich denke, es ist der richtige Ansatz um mein problem zu lösen hier beschrieben: stackoverflow.com/questions/32742601/...

InformationsquelleAutor g19fanatic | 2012-08-16
Schreibe einen Kommentar