2009-12-29 20 views
5

Yo he estado buscando esto por un tiempo ahora- Cuándo utilizar DataContractSerializer/Binario/XMLSerialiser

Parece que la serialización binaria se desaconseja ya que cualquier cambio de nombres de campo rompe serialización =? No es bueno

XMLSerializer es problemático porque hay que proporcionar un constructor sin arg y campos públicos aunque tienes más control sobre los elementos de ser atributos o elementos y su puesto el nombre

DataContractSerializer es bueno, pero todos suclassses necesita ser explícitamente añadido que es una pena

Sin embargo, me encontré con NetDataContractSerializer que no tiene esta limitación.

Si su objetivo es la serialización de C# y no hay grandes limitaciones en el tamaño de xml, NetDataContractSerializer siempre es el camino a seguir aquí?

Respuesta

10

Dan Rigsby tiene un muy buen artículo comparativo en XmlSerializer vs. DataContractSerializer y también toca en el NetDataContractSerializer.

DataContractSerializer:

  • es rápido - alrededor de 10% más rápido que XmlSerializer
  • es interoperable - funciona a la perfección con Java, Ruby - lo que sea
  • utiliza explícita "opt-in" modelo - necesita marca lo que se serializa
  • no requiere ningún constructor
  • se puede serializar miembros no públicos y campos internos
  • no soporta atributos en los nodos XML

le indican el DCS explícitamente lo para serializar, pero no tienen mucha influencia sobre la forma en está hecho.

XmlSerializer

  • serializa sólo los campos y propiedades públicas
  • serializa todo excepto de los que excluya (modelo opt-out)
  • atributos de apoyo y todo
  • es interoperable - funciona a la perfección con Java, Ruby: lo que sea
  • requiere un constructor sin parámetros para la deserialización

Usted le dice claramente al XmlSerializer cómo y qué serializar, pero no puede serializar todo, solo las propiedades visibles públicamente.

NetDataContractSerializer es un poco extraño, no es interoperable, funciona solo si ambos extremos son .NET: incluye información de tipo .NET en el mensaje (lo que lo hace más grande). No puede agregarlo declarativamente a un servicio WCF "fuera de la caja".

Es un compromiso difícil, como siempre. Definitivamente, manténgase alejado de cualquier formateador binario, no es compatible con versiones anteriores, es frágil y le dará dolores de cabeza, use una de esas formas estándar de hacerlo. Cuál es el "mejor" para su escenario dado es realmente difícil de decir, tendrá que descubrirlo por sí mismo ...

+2

Xml Serializer también es muy interoperable. La desventaja principal son las restricciones o restricciones en el modelo de programación (ust tiene ctor predeterminado, para ser serializado, los datos deben ser públicos, etc.). ps: XML serializer también serializa public * fields *, además de las propiedades. – Cheeso

+0

@ Cheeso: sí, gracias, buenos puntos –

2

Marc Gravell muestra en su blog the results of a benchmark lo hizo con DataContractSerializer, XmlSerializer, y la mayoría de los otros serializadores .NET, incluida protobuf-net (una implementación de Protocol Buffers para .NET que creó).