Domanda

Utilizzando Buffer di protocollo di google, ho un servizio già scritto in Java che ha il suo possedere già strutture di dati. Vorrei usare pb per recapitare i messaggi e sto cercando un modo per serializzare le strutture di dati esistenti che ho in Java su pb. Posso iniziare definendo da zero tutte le strutture di dati in pb, che è probabilmente la strada giusta da percorrere ma sono troppo pigro. Quindi, supponiamo che io abbia una classe Person in Java (o altri linguaggi supportati) o una classe Plane che contiene decine di attributi, c'è un modo per serializzare quella classe su pb? Posso avere un attributo pb di tipo Plane? (quando Plane non è un pb, è una classe Java)

È stato utile?

Soluzione

No, non puoi. I campi nei messaggi protobuf sono sempre le primitive (numeri, stringhe e array di byte, in sostanza), protobuf enum (che sono generati come enum Java) o messaggi protobuf - e versioni ripetute di tutti questi, ovviamente.

Potresti potenzialmente scrivere uno strumento che usa la riflessione per creare un file .proto da una classe Java, ma sospetto che lo troverai più veloce solo per farlo a mano. In particolare, se hai usato la riflessione, vorresti assicurarti che i campi fossero sempre generati con lo stesso nome, per mantenere la compatibilità. Una cosa che potresti fare è annotare le classi Java e scrivere il codice per generare il file .proto basato su tali annotazioni - o anche potenzialmente serializzare direttamente in formato proto usando le annotazioni. Personalmente consiglierei di creare il file .proto in in qualche modo piuttosto che riscrivere efficacemente il progetto PB - altrimenti c'è un rischio significativo di introdurre bug dove c'è già un codice già testato.

Se fai crei un sistema di annotazioni, sono sicuro che Kenton Varda (e il resto della comunità PB) sarebbero interessati a vederlo.

Altri suggerimenti

Un modo in cui mi viene in mente è di avere un campo stringa in un protobuf e serializzare una classe Java su quel campo usando la serializzazione primitiva di Java. In questo modo, supponendo che il destinatario del messaggio sappia come leggerlo / deserializzarlo, posso facilmente serializzare i messaggi da Java a Java.

Tuttavia, ci sono aspetti negativi di questa tecnica. Per citarne alcuni:

  1. È solo da Java a Java (no C ++, Python o altri)
  2. Non è efficiente come lo sono i protobuf nativi (né l'analisi / serializzazione né la dimensione del messaggio)
  3. Hai la logica delle strutture dati sparse in diversi punti, alcune sono nel file di definizione dei protobuf, altre in altre classi Java e questo rende le cose più difficili da mantenere.

Ma - esegue il lavoro a breve termine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top