DataContractSerializer vs XmlSerializer: Prós e Contras de cada serializador

84

Meu aplicativo de desktop serializa objetos usando XmlSerializer. Fui sugerido para alavancar em DataContractSerializervez disso.
Em quais cenários devo usar DataContractSerializer?

Muito Obrigado

Comentários.
1. O arquivo XML de saída é armazenado localmente. Nenhum outro aplicativo desserializa objetos desse arquivo XML.
2. Meu aplicativo é executado com .NET Framework 3.5 SP1.

Vitali Climenco
fonte
Consulte também datacontract-vs-xmltype
nawfal

Respostas:

112

Dan Rigsby tem o post definitivo sobre isso - vá lê-lo!

XmlSerializer vs. DataContractSerializer (arquivo da web)

Ele diz tudo o que há a dizer e de uma forma muito convincente.

Em resumo:

XmlSerializer:

  • já existe há muito tempo
  • é "opt-out"; tudo que é público é serializado, a menos que você diga para não ([XmlIgnore])

DataContractSerializer é:

  • o novo garoto na cidade
  • otimizado para velocidade (cerca de 10% mais rápido que o XmlSerializer, normalmente)
  • "opt-in" - apenas o que você marca especificamente como [DataMember]será serializado
  • mas qualquer coisa marcada com [DataMember]será serializada - seja publicouprivate
  • não suporta atributos XML (por razões de velocidade)
marc_s
fonte
2
@ Paul-SebastianManole: o DataContractSerializer não suporta atributos XML - por razões de velocidade. O que há para elaborar?
marc_s
6
@ Paul-SebastianManole: se o seu XML de origem contém atributos em elementos XML (como <Customer Id="42"> ...), então sua única opção é usar o serializador XML
marc_s
2
Isso pode ser útil, retirado do MSDN: a classe XmlSerializer oferece suporte a um conjunto de tipos muito mais restrito do que a classe DataContractSerializer, mas permite muito mais controle sobre o XML resultante e oferece suporte muito mais ao padrão de linguagem de definição de esquema XML (XSD). Também não requer nenhum atributo declarativo nos tipos serializáveis ​​... A classe XmlSerializer não oferece suporte a tipos de contrato de dados. MSDN .
Paul-Sebastian Manole de
1
@OO: não apenas opt-in, no .NET 3.5 SP1 e mais recente - mas para mim, ainda é a maneira preferida de fazer as coisas. Permite que você defina propriedades que de outra forma não poderiam ser definidas (como ordem de serialização, namespaces e muito mais!)
marc_s
17
Maior aviso sobre o DataContractSerializer - ao desserializar, ele se preocupa com a ordem dos elementos e falha silenciosamente se eles não estiverem na ordem correta. Imho, a menos que você esteja usando exatamente os mesmos conjuntos em ambas as extremidades, isso o torna extremamente perigoso.
Pxtl