9

DataContractSerializer richiede classi e membri da contrassegnare con gli attributi DataContract e DataMember. Tuttavia, nel mio caso le classi sono generate automaticamente con il framework EFPocoAdapater e questi attributi non sono presenti.DataContractSerializer: come serializzare classi/membri senza DataContract/DataMember attributi

Come posso forzare la serializzazione di tutti i membri utilizzando DataContractSerializer senza che questi attributi siano presenti?

Da Alexdej:

situazione è cambiata in 3.5SP1, spero che avete visto che: http://www.pluralsight.com/community/blogs/aaron/archive/2008/05/13/50934.aspx

risposta

6

Non è possibile - puro e semplice. L'attributo è necessario per DataContractSerializer per raccogliere gli elementi da serializzare. In contratto con XmlSerializer, che sostanzialmente serializza tutto (a meno che tu non dica esplicitamente di ignorarlo), DataContractSerializer è "opt-in" - devi dire esplicitamente (tramite gli attributi) quali campi e/o proprietà serializzare.

UPDATE: Come parecchie persone hanno fatto notare, con NET 3.5 SP1, Microsoft allentato queste regole un po '- ogni lettura pubblica/scrivere proprietà verrà serializzato automaticamente dal DataContractSerializer. Allo stesso tempo, la classe deve anche avere un costruttore senza parametri di default - suona come i requisiti esatti abbiamo avuto per XmlSerializer via del ritorno quando ....

Naturalmente, questo:

  • non lo fa ti permette di serializzare qualcosa di privato - se vuoi serializzarlo, devi esporlo come proprietà pubblica di lettura/scrittura
  • non ti permette di specificare un ordine scelto definito dei parametri - li userà semplicemente nel ordina che compaiano nella classe
  • ora richiede di avere di nuovo un costruttore senza parametri nella tua classe deserializzazione

Continuo a pensare che queste cose debbano essere esplicite e chiare, rendendo quelle che non sono più necessarie apre la strada alla programmazione pigra/sciatta - Non mi piace. Ma se si vuole, si può utilizzare la società senza marcatura in modo esplicito le proprietà con [DataMember] .....

Marc

+0

Speravo davvero che ti saresti sbagliato, ma dopo molto google ho paura che tu abbia ragione. Non è possibile utilizzare XmlSerializer (problema di riferimento circolare che funziona con Entity Framework). Ah bene, classi anonime lo è. – aleemb

+1

Beh, stavo leggendo un po 'di più su questo oggi, e qui ho scoperto che se le tue classi usate da DataContractSerializer sono marcate con [Serializable], allora per impostazione predefinita saranno serializzate in modo molto simile al formattatore SOAP vecchio stile - OGNI campo singolo indipendentemente dalla visibilità è incluso. Potrebbe esserti d'aiuto forse? –

+0

Beh, non proprio perché il mio problema è che non posso toccare le classi generate automaticamente e devo essere in grado di ignorare esternamente i campi. Sto usando le proiezioni nelle mie query linq per aggirare questo ora che funziona bene. – aleemb

0

credo che sia possibile. Se si implementa l'interfaccia ISerializable, il serializzatore utilizza l'implementazione anziché gli attributi. Anche se penso che dovrai ancora contrassegnare la classe [Serializable].

È un po 'più di lavoro che aggiungere attributi ma funziona.

0

Contrassegna semplicemente la classe con l'attributo [Serializable]. Qualsiasi membro che non si desidera contrassegnare con il segno serializzato con [Non serializzato]. Notare che [Serializable] causa la serializzazione di tutti i campi per impostazione predefinita, dove [DataContract] non ha serializzato i campi per impostazione predefinita tranne quelli contrassegnati con [DataMember].

Problemi correlati