2012-01-29 8 views
5

Sto per avviare un progetto per connettere due programmi, uno in C# e uno in C++. Ho già un programma C# funzionante, che è in grado di parlare con altre versioni di se stesso. Prima di cominciare con la versione C++, ho pensato di alcune tematiche:Buffer di protocollo, ottenendo C# per parlare con C++: problemi di tipo e problemi dello schema

1) sto usando v1 protobuf-net. Prendo i file .proto dal serializzatore sono esattamente quelli che sono richiesti come modelli per la versione C++? Una ricerca su google ha menzionato qualcosa sulla custodia pascal, ma non ho idea se sia importante.

2) Cosa faccio se uno dei tipi .NET non ha una controparte diretta in C++? Cosa succede se ho un decimale o un dizionario? Devo modificare i file .proto in qualche modo e schiacciare i dati in una forma diversa? (I esamina i file e vedere se riesco a capirlo)

3) Ci sono altri trucchi che le persone possono pensare? Formati binari e cose del genere?

EDIT ho avuto uno sguardo a uno dei file di proto ora. Sembra che le cose specifiche di .NET vengano taggate ad esempio bcl.DateTime o bcl.Decimal. I sottotipi sono inclusi nelle definizioni di proto. Non sono sicuro di cosa fare con i tipi di bcl, però. Se il mio C++ prog vede un decimale, che cosa farà?

risposta

4
  1. Sì, i file di proto devono essere compatibili. L'involucro riguarda le convenzioni, che non dovrebbero influire sulla funzionalità effettiva - solo il codice generato ecc.

  2. Non è se sia presente o meno un tipo direttamente comparabile in .NET che è importante - è se i buffer di protocollo supportano il tipo che è importante. I buffer di protocollo sono per lo più piuttosto primitivi - se vuoi creare qualcosa di più grande, devi creare i tuoi messaggi.

  3. Il punto di buffer di protocollo è quello di rendere il tutto compatibile a livello binario sul filo, quindi non c'è davvero non dovrebbe essere grattacapi ... leggere la documentazione per scoprire versioni politiche ecc L'unica cosa che posso basti pensare che nella versione Java, almeno, è una buona idea rendere facoltativi i campi enum, e dare al tipo enum stesso un valore zero di "sconosciuto" che verrà usato se si tenta di deserializzare un nuovo valore che non è supportato ancora nel codice di deserializzazione.

3

Alcune piccole aggiunte ai punti di Jon:

  • v1 protobuf-net ha un Getaproto che può aiutare con un punto di partenza, tuttavia, ai fini di interoperabilità consiglierei partire da una .proto; protobuf-net può lavorare questo era intorno troppo, sia attraverso "ProtoGen", oppure tramite il componente aggiuntivo VS
  • diverso da quello, non dovrebbe avere i miei problemi, purché si ricordi per il trattamento di tutti i file in formato binario; l'apertura dei file in modalità testo causerà dolore
+0

Non sono sicuro di quello che la distinzione è? Ho usato Serializer.GetProto per ottenere una stringa, che era perfettamente leggibile e sembra un file .proto. – Carlos