2009-08-26 11 views
14

Cercando di farmi un'idea su google protobuf. Ho trovato alcune implementazioni di protobuf in C# ma sembra che manchi di una caratteristica: la capacità di generare automaticamente i file .proto da una classe C# esistente decorata con attributi.Come posso generare un file .proto da una classe C# decorata con attributi?

Il motivo per cui voglio farlo in questo modo invece di passare dalle classi C# generate automaticamente dal file .proto è perché ho già le classi C# definite nel mio progetto e non voglio duplicarle solo per soddisfare protobuf.

Qualcuno ha riscontrato uno scenario simile?


Aggiornamento

È questo possibile decorare solo una classe C# e non utilizzare un file Proto da usare protobuf?

risposta

21

Buone notizie; quello che hai descritto (avendo le classi C# esistenti) è il caso d'uso previsto di protobuf-net. Tutte le cose .proto ("protogen", il componente aggiuntivo VS, ecc.) Sono state tutte aggiunte come ripensamenti . Il nucleo di protobuf-net non li conosce o si preoccupa di loro.

buffer di protocollo definisce un DSL (.proto, come si menziona) condiviso tra le implementazioni ed è (talvolta) utilizzato per la generazione del codice. Quando scrissi per la prima volta protobuf-net, l'aspetto della generazione del codice non era la mia più grande preoccupazione - semplicemente che gli sviluppatori .NET sono generalmente colpevoli (me stesso incluso) di "implementazione prima" piuttosto che "contratto prima".

Di conseguenza, protobuf-net non necessita di file .proto per funzionare; una classe attribuita è sufficiente per serializzare/deserializzare in modo univoco. Basta usare Serializer.Serialize, .Merge e .Deserialize (ecc.).

Detto questo; si fa includono alcune molto sotto-sviluppato e sperimentale supporto per questo:

string proto = Serializer.GetProto<YourType>(); 

Questo è ben lungi dall'essere completo, ma può funzionare per i tipi semplici. Se hai casi specifici in cui non riesce, fammelo sapere (aggiungi un commento o registra un problema). Però; la maggior parte delle volte, le persone interessate a .proto scriverebbero la .proto prima e lavoreranno da lì.

Esempi di tipi di lavoro decorati sono visualizzati su project home page; dipende esclusivamente da te se usi gli attributi WCF, gli attributi xml o gli attributi protobuf-net (sebbene questi ultimi forniscano un maggiore controllo su alcuni specifici punti di serializzazione, come l'ereditarietà e i layout numerici).

+0

Grande, questo si adatterebbe quindi alle mie esigenze. Tuttavia, un'altra cosa, Protobuf-Net implementa l'intera specifica di Protobuf? –

+0

Abbastanza; le specifiche del formato del filo non sono vaste, a dire il vero. Stai cercando di utilizzare una implementazione separata di .proto? Dovrebbe funzionare bene, ma se hai * un * .proto (per l'altra estremità), ti consiglio di generare un DTO (da .proto) e uno shim a quello dei tuoi tipi. Diventa anche creativo, permettendo a protobuf-net di supportare l'ereditarietà (che è ** non ** parte della specifica core .proto), ma fatta in un modo che consente comunque un'interopedine completa con altri client. –

+0

Non sto cercando di interoperare con un'altra implementazione. Userò protobuf-net come un meccanismo efficiente per serializzare/deserializzare un'intera gerarchia di oggetti tra due applicazioni. –

4

Prima Skeet Marc corre qui e ottiene massiccia up, vorrei sottolineare protobuf.net.

+3

In realtà, quello sarei io ;-p –

+0

Sì, ho guardato il progetto ma non riesco a trovare documentazione su come generare file .proto da una classe C# decorata. O è necessario avere un file .proto per usare protobuf? –

+0

Beh, ricordo solo Skeet che ne parlava ... – Will

Problemi correlati