2009-07-27 28 views
22

Tengo código usando XmlSerializer para serializar/deserializar una estructura de datos para la persistencia. He leído y oído en varios lugares aquí en StackOverflow que XmlSerializer es uno o más de:Reemplazo para Serialización XML

  • Malo
  • soportado mal/implementado
  • Posiblemente no será compatible en el futuro

Mi pregunta es doble; ¿Alguno de los anteriores es verdadero? De ser así, ¿qué alternativas existen? Para mis propósitos, XML funciona muy bien, y me gustaría mantenerlo constante, pero todo lo demás está abierto a cambios.

EDIT: Si desea sugerir algo diferente a XML, estoy abierto a ello, pero tiene que ser legible por el ser humano.

Respuesta

12

XmlSerializer es perfectamente compatible, pero tiene algunas fallas técnicas;

  • relativamente lento; pero usualmente esto es lo suficientemente rápido
  • solo es compatible con miembros públicos; puede ser un dolor
  • requiere escritura accessores listas - simplemente feas

Sin embargo, espero que siga siendo allí por un tiempo considerable; IMO, es BinaryFormatter que tiene problemas reales (cuando se usa para persistencia).

Soy muy parcial (ya que soy el autor), pero elegiría protobuf-net; un serializador binario que usa el formato de cable de "búferes de protocolo" de Google; Rápido, portátil entre idiomas/plataformas, salida muy pequeña, tolerante a la versión, etc. (y gratis, por supuesto). Sin embargo, claramente no es xml, por lo que no es legible para humanos.

+0

Marc, ¿es (fácilmente) posible reemplazar el BinaryFormatter por defecto con protobuf-net para usar con .Net remoting? – M4N

+0

No * requiero * XML (aunque sería bueno, por lo que no interrumpe las instalaciones existentes), pero sí requiero lectura humana. Gracias por la lista de desventajas sin embargo. –

+2

Para la comunicación remota, puede implementar 'ISerializable' (a través de protobuf-net) en aproximadamente 4 líneas de código por objeto; acerca de lo mejor que puedo obtener ... esto solo es necesario para los objetos "raíz" (no cosas que están encapsuladas). Para lectura humana ... ¿tal vez JSON.Net? –

1

Si puede usar .Net 3.5 (preferiblemente SP1), buscaría en el DataContractSerializer. Aunque es menos configurable que el XmlSerializer, es más rápido, más fácil de trabajar (al menos en mi experiencia) y más portátil (es decir, para servicios web). SP1 cambió el comportamiento predeterminado de la opción de exclusión, por lo que puede serializar cualquier clase sin tener que definir atributos explícitamente en todo lo que necesita para serializar.

Recomendaría leer atentamente la documentación allí antes de invertir en ella como un cambio. Dependiendo de la personalización de su serialización, puede que no funcione para usted.

+0

Aparte de tener algunas clases puramente como clases de tipo envoltura, no hay nada demasiado especial sobre la materia 'XmlSerializer' que he hecho. No anula ni nada de eso. –

2

jSON es mucho más rápido que XML. Puede usar Json.NET para leerlo. Tiene una serialización incorporada.

http://james.newtonking.com/pages/json-net.aspx

+9

¿Tiene algún número para respaldar ese reclamo de rendimiento? –

+1

Realicé algunas pruebas, puedo confirmar que los archivos/secuencias que produce JSON.Net son más pequeños, pero la velocidad es solo un 10% más rápida en la serialización (cuando está configurada para no sangrar) y aproximadamente un 50% más lenta en la deserialización. Este es solo un conjunto de pruebas, en un conjunto de datos, por supuesto. También sospecho que mis configuraciones de JSON.Net en la deserialización están causando el retraso: debido a un problema de tipo abstracto de lista genérica, tuve que pedirle que buscara información de tipo adicional en TODOS los objetos, lo que no es ideal. – Tao

+0

(JSON.Net también es mucho más agradable: puede manejar tipos no públicos, subtipos sin el hack XmlInclude, referencias recursivas de múltiples maneras y más, pero juro que no estoy afiliado de ninguna manera :) :) – Tao

4

En cuanto a la serializador XML, no hay "soportado", y hay "soportado".

Un número creciente de informes de fallas de Connect en el Serializador XML están regresando reconociendo errores, y afirmando que los errores no serán corregidos.

Estoy seguro de que si se encuentra con un error crítico de seguridad en el Serializador XML, se solucionará.Sin embargo, creo que es poco probable que se solucionen otros errores que no son tan críticos.

1

Voy a tomar una vista alternativa:
XmlSerializer es compatible, se conocen sus comportamientos y funciona bien. No está mal". Es muy general, está bien documentado y tiene muchos ejemplos. El rendimiento es probablemente muy bueno para lo que necesita. Probablemente hace lo que necesitas.

Hay algunas personas que tienen necesidades particulares que no están cubiertas por el XmlSerializer. De esos requisitos obtenemos cosas como protobufs, DataContractSerializer y otras opciones.

Pero XmlSerializer sigue siendo muy general y probablemente el serializador más ampliamente aplicable en la ciudad. Todavía es probablemente la apuesta más segura para serializar contenido.


Como para apoyar ...
MS pueden estar ralentizando en la fijación de los errores. Lo comparo con WinForms. WinForms ya no es el marco de interfaz de usuario principal impulsado por Microsoft. Pero todavía está maduro, funciona bien, funciona bien. XmlSerializer es lo mismo.

En cuanto a soporte en el futuro. MS tiene una política de soporte 5 + 5: admiten un producto durante 5 años después de su lanzamiento, y luego puede comprar 5 años de soporte adicional para él. .NET Framework no es la "cosa" admitida: es el sistema operativo Windows el que incluye .NET que es compatible. Windows 7 incluirá .NET 3.5 (¿creo que la versión es 3.5?) Y todo en .NET 3.5, incluidos WinForms y XmlSerializer, será "oficialmente compatible" durante 5 años adicionales, a partir de octubre o cuando se lance Win7. Si es .NET 4.0, todo lo que esté en 4.0 (incluido, aún, WinForms y XmlSerializer) será soportado por 5 años. El reloj de 5 años se reinicia cada vez que un nuevo producto se envía con .NET.

En cuanto a VB6 Runtime, originalmente se envió con Visual Studio 6, en 1998. Se ha incluido en Windows desde entonces, incluido Windows Server 2008 R2, lanzado este año. Por lo tanto, el tiempo de ejecución de VB se admitirá al menos hasta 2014. Eso es 16 años de soporte principal, al menos.

No tiene nada de qué preocuparse en cuanto a soporte oficial. Este no es un proyecto de código abierto del que hablas. Esta no es una oferta provisional como WSE o SOAP Toolkit.

Es cierto que hay grados de compatibilidad, y las API .NET más antiguas se vuelven prioritarias a medida que se lanzan y promueven las más recientes. Pero los mayores son presumiblemente más estables, para el momento en que se estancan. Estás totalmente a salvo.

+0

@ Cheeso: ¿sabes algo sobre el ritmo de las correcciones de errores? Hago. He visto errores importantes cerrados al decir: "es un error real, pero este es el código heredado, por lo que no vamos a solucionarlo". –

+0

no, no sé nada, sus observaciones directas son probablemente el mejor indicador. Sé que las personas que diseñaron el XmlSerializer y que se usaron para mantenerlo ahora se mueven a diferentes proyectos. Ha hecho la transición a nuevos propietarios. – Cheeso

+0

Desde el 28 de junio de 2009, he visto los problemas de Connect cerrados, "no vamos a solucionarlo por el riesgo de romper algo". El serializador XML se admite cada vez menos. –

Cuestiones relacionadas