Al mio server, riceviamo messaggi autodescritti (come definito here ... che non era tutto così facile in quanto non ci sono esempi "buoni" di questo in C++).Come creare dinamicamente un nuovo protobuf da un insieme di descrittori già definiti?
A questo punto non ho problemi a creare messaggi da quelli descritti. Posso prendere il FileDescriptorSet, passare attraverso ogni FileDescriptorProto, aggiungendo ciascuno a un DescriptorPool (usando BuildFile, che mi dà anche ogni FileDescriptor definito).
Da qui posso creare uno dei messaggi che sono stati definiti nel FileDescriptorSet con un DynamicMessageFactory istanziato con il DP e chiamando GetPrototype (che è molto facile da fare come il nostro SelfDescribedMessage richiesto il FULL_NAME messaggi() e quindi possiamo chiamare il metodo FindMessageTypeByName del DP, che ci fornisce il Message Prototype correttamente codificato).
La domanda è: come posso prendere ciascun descrittore o messaggio già definito e COSTRUIRE dinamicamente un messaggio "principale" che contiene tutti i messaggi definiti come messaggi nidificati. Questo dovrebbe essere usato principalmente per salvare lo stato corrente dei messaggi. Attualmente stiamo gestendo questo semplicemente istanziando un tipo di ogni messaggio nel server (per mantenere uno stato centrale tra diversi programmi). Ma quando vogliamo "salvare" lo stato attuale, siamo costretti a riversarli su disco come definito here. Sono in streaming un messaggio alla volta (con un prefisso di dimensione). Ci piacerebbe avere UN messaggio (uno per dominarli tutti) invece del flusso costante di messaggi separati. Questo può essere usato per altre cose una volta elaborato (stato condiviso basato sulla rete con serializzazione ottimizzata e facile)
Dato che abbiamo già i Descrittori incrociati e definiti, si potrebbe pensare che ci sarebbe un modo semplice per costruire "nuovi" messaggi da quelli già definiti. Finora la soluzione ci ha alluso. Abbiamo provato a creare il nostro DescriptorProto e ad aggiungere nuovi campi del tipo dai nostri Descrittori già definiti ma ci siamo persi (non ci siamo ancora immersi profondamente in questo). Abbiamo anche cercato di aggiungerli come estensioni (attualmente sconosciuta come farlo). Abbiamo bisogno di creare il nostro DescriptorDatabase (anche sconosciuto al momento come farlo)?
Eventuali approfondimenti?
collegato example source su BitBucket.
Speriamo che questa spiegazione possa essere d'aiuto.
Sto tentando di creare dinamicamente un messaggio da un insieme di messaggi già definiti. L'insieme di messaggi già definiti viene creato usando il metodo "auto-descritto" spiegato (brevemente) nel tutorial ufficiale C++ protobuf (cioè questi messaggi non sono disponibili in forma compilata). Questo messaggio appena definito dovrà essere creato in fase di runtime.
Ho provato a utilizzare i descrittori lineari per ciascun messaggio e ho tentato di creare un FileDescriptorProto. Ho provato a guardare i metodi DatabaseDescriptor. Entrambi senza fortuna. Attualmente si sta tentando di aggiungere questi messaggi definiti come un'estensione a un altro messaggio (anche se in fase di compilazione quei messaggi definiti e il loro 'set di descrittori' non sono stati classificati come estensioni di qualcosa) che è il punto in cui inizia il codice di esempio.
wow ... neanche in testa ... Ecco dove sono a finora. Questo è l'unico di cui ho una fonte pubblica ... ovviamente non viene compilato in questo momento (tutto va bene fino alla fine in cui viene creato per la prima volta ExtensionSet) ... Cercando di percorrere la rotta delle estensioni al momento mentre l'altra due mi hanno fallito fino ad ora. http://goo.gl/VJhnk – g19fanatic
Il problema che sto avendo al momento è nell'inizializzazione dell'identificatore di estensione. Ho bisogno di una classe per puntare i MessageTypeTraits a quella di uno che descrive il tipo di messaggio (potrebbe dover fare la mia magia di templateing) ma non ho ancora avuto successo ... – g19fanatic
Onestamente, ho letto la tua domanda 3 volte, e ancora non riescono a capire cosa stai descrivendo. Penso che questo accada alla maggior parte dei lettori, ecco perché non hai ricevuto una risposta. Hai bisogno di semplificare le cose. Inoltre, sembra davvero che tu stia creando qualcosa di complicato, in cui è possibile una soluzione molto più semplice. – Codeguard