DataContractSerializer vs XmlSerializer: pro e contro di ogni serializzatore


86

La mia applicazione desktop serializza gli oggetti usando XmlSerializer. Mi è stato suggerito di fare leva DataContractSerializerinvece.
In quali scenari dovrei usare DataContractSerializer?

Grazie molto

Commenti.
1. Il file XML di output viene archiviato localmente. Nessun'altra applicazione deserializza gli oggetti da quel file XML.
2. La mia applicazione viene eseguita con .NET Framework 3.5 SP1.


Risposte:


114

Dan Rigsby ha il post definitivo su questo - vai a leggerlo!

XmlSerializer e DataContractSerializer (archivio web)

Dice tutto quello che c'è da dire, e in modo molto convincente.

In breve:

XmlSerializer:

  • è in circolazione da molto tempo
  • è "opt-out"; tutto ciò che è pubblico viene serializzato, a meno che tu non gli dica di non farlo ([XmlIgnore])

DataContractSerializer è:

  • il nuovo ragazzo in città
  • ottimizzato per la velocità (circa il 10% più veloce di XmlSerializer, in genere)
  • "opt-in": [DataMember]verranno serializzati solo i contenuti che contrassegni specificamente come
  • ma qualsiasi cosa contrassegnata con [DataMember]verrà serializzata, che sia publicoprivate
  • non supporta gli attributi XML (per motivi di velocità)

2
@ Paul-SebastianManole: DataContractSerializer non supporta gli attributi XML, per motivi di velocità. Cosa elaborare?
marc_s

6
@ Paul-SebastianManole: se il tuo XML sorgente contiene attributi su elementi XML (come <Customer Id="42"> ...) allora l'unica opzione è usare il serializzatore XML
marc_s

2
Questo potrebbe essere utile, preso da MSDN: la classe XmlSerializer supporta un set di tipi molto più ristretto rispetto alla classe DataContractSerializer, ma consente un controllo molto maggiore sull'XML risultante e supporta molto di più dello standard XSD (XML Schema Definition Language). Inoltre non richiede attributi dichiarativi sui tipi serializzabili ... La classe XmlSerializer non supporta i tipi di contratto dati. MSDN .
Paul-Sebastian Manole

1
@OO: non solo opt-in, in .NET 3.5 SP1 e versioni successive, ma per me è ancora il modo preferito di fare le cose. Consente di impostare proprietà che altrimenti non possono essere impostate (come ordine di serializzazione, spazi dei nomi e molto altro!)
marc_s

17
Avviso più grande su DataContractSerializer: durante la deserializzazione, si preoccupa dell'ordine degli elementi e non riesce silenziosamente se non sono nell'ordine corretto. Imho, a meno che tu non stia usando gli stessi identici assemblaggi ad entrambe le estremità, questo lo rende insolitamente pericoloso.
Pxtl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.