2011-06-25 2 views
5

Per serializzare una classe con protobuf-net, si neet per fornire la classe e gli attributi di proprietà [ProtoContract] e [ProtoMember (n)] - dove n è 1,2,3, .., eccIn Protobuf-net, è possibile serializzare le classi non decorate?

Appart dalla clonazione a un'immagine speculare di una classe, è possibile serializzare/deserializzare una classe di cui non abbiamo il controllo?

Ad esempio:

utilizzando ProtoBuf;

  • Serializer.Serialize <eccezione> (OutputStream, eccezione);

o

  • Serializer.Serialize < Tuple < dati, Eccezione > > (OutputStream, dataWithPossibleException);

NB. dicono che Data ha [ProtoContract]/[ProtoMember] e gli altri no.

possibili approcci:

  • Sarebbe bello se avessimo "attributi di estensione", che hanno lavorato come metodi di estensione. [non possibile]
  • replicare la classe localmente e quindi copiare in/dall'oggetto prima serializzazione/deserializzazione [che funzionerebbe, ma la produttività diminuisce]
  • generare un file di proto esterno/definizione per la classe e archiviarlo in risorse? [Qualcuno sa come fare per questo?]

risposta

3

Ci sono opzioni in v2 qui:

  • è possibile configurare un RuntimeTypeModel dicendogli sui tipi e membri senza bisogno di attributi
  • per i tipi che sono scomodi, un surrogato può essere fornito per semplificare la serializzazione (deve avere operatori di conversione da/verso il tipo originale)
  • per le API in cui i tipi non sono tipizzati staticamente, c'è un'opzione per includere i metadati di tipo

Ora, penso che alcuni di questi indirizzi alcuni dei tuoi punti. Se è possibile specificare pienamente uno scenario che è problematico, potrei essere in grado di essere più specifico (o pensare a nuovi modi di torturare il codice per farlo funzionare).

Ma per rispondere alla domanda del titolo (non decorata): sì, in v2

+0

Grazie per anticipare questa esigenza! Per il momento ho scelto l'opzione surrogata, in cui ho decompilato le classi minuscole e le ho inserite nella mia assemblea. Principalmente cerco di aderire a POCO, quindi una tantum come questa non è un grosso problema. Controllerò le nuove opzioni della versione 2. – sgtz

+0

@sgtz il metodo SetSurrogate dovrebbe renderlo più diretto e conveniente –

+0

btw: Avevo una versione leggermente più vecchia di v2. Quindi, premo l'aggiornamento su svn e ora posso serializzare/deserializzare >. Inoltre, ho dovuto rimuovere + readd il binario protobuf-net. Non so di cosa si trattasse, ma ora funziona bene.Grazie per aver reso pubblico questo progetto ... e anche, grazie a Google. Dovrei menzionare che a questo punto, sto * ancora * usando la mia copia di Tuple, non quella nel namespace System. – sgtz