¿Cuál es el más flexible de la serialización .NETO de los objetos, sin embargo, fácil de implementar?

StackOverflow https://stackoverflow.com/questions/106599

Pregunta

Me gustaría para serializar y deserializar objetos sin tener que preocuparse de todo el gráfico de la clase.

La flexibilidad es la clave.Me gustaría ser capaz de serializar cualquier objeto pasa a mí sin completar los atributos necesarios a lo largo de todo el objeto gráfico.

Eso significa que la Serialización Binaria no es una opción, ya que sólo funciona con el otro .RED de Plataformas.Me gustaría también como algo legible por una persona, y por lo tanto descifrable por un programa de gestión y otros los intérpretes.

He encontrado problemas con el DataContract, JSON, XML y Serializadores.

  • La mayoría de estos errores parecen centro alrededor de la Serialización de Listas o Diccionarios (es decir, XML Serializable Diccionario Genérico).
  • "Agregar cualquier tipo no se conoce de forma estática a la lista de tipos conocidos - para ejemplo, mediante el uso de la KnownTypeAttribute atributo o por añadir a la lista de conocidos tipos pasado a DataContractSerializer."

Por favor, base sus respuestas en experiencias reales y no de la teoría o de la lectura de un artículo.

¿Fue útil?

Solución

Han considerado que la serialización a JSON en lugar de XML?

Json.NET tiene un muy potente y flexible serializador que no tiene problemas con tablas de hash/diccionarios genéricos y no requiere ningún tipo de atributos particulares.Lo sé porque yo lo escribí :)

Te da montones de control a través de varias opciones en el serializador y permite anular cómo un tipo se serializa mediante la creación de un JsonConverter para ello.

En mi opinión JSON es más legible para los humanos de XML y Json.NET da la opción de escribir bien con formato JSON.

Por último, el proyecto es de código abierto así que usted puede entrar en el código y hacer modificaciones si es necesario.

Otros consejos

Si mal no recuerdo funciona algo como esto con una propiedad:

[XmlArray("Foo")]
[XmlArrayItem("Bar")]
public List<BarClass> FooBars
{ get; set; }

Si usted serializado este obtendrá algo como:

<Foo>
    <Bar />
    <Bar />
</Foo>

Por supuesto, probablemente debería diferir de los expertos.Aquí hay más información de MS: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx

Déjeme saber si funciona para usted.

A partir de sus requerimientos suena como la Serialización Xml es el mejor.

Qué tipo de problemas tienes con las colecciones cuando serialización?Si te refieres a no saber qué atributos a utilizar en una Lista o algo similar, puede probar con el XmlArray atributo en su propiedad.Definitivamente, usted puede serializar una colección.

El IntermediateSerializer en el XNA Framework es bastante maldito frío.Usted puede encontrar un montón de tutoriales sobre su uso en http://blogs.msdn.com/shawnhar

JABÓN de Serialización funcionado bien para mí, incluso para los objetos que no estén marcadas con [Serializable]

Vas a tener problemas con la recolección de serialización si los objetos de la colección contiene ninguna referencia a otros objetos de la misma colección.Si cualquier tipo de dual-señalando existe, al final de la creación de un multi-mapa que no puede ser serializado.En cada problema que he tenido nunca serializar una colección personalizada, siempre fue la causa de algún añadido la funcionalidad que necesitaba que funcionaba bien como parte de un "típico" de la aplicación cliente-servidor y, a continuación, fracasó miserablemente como parte de un consumidor-proveedor de servidor de aplicaciones.

Poner todas las clases que desea serializar en un conjunto separado y, a continuación, utilizar el sgen herramienta para generar un ensamblado de serialización para serializar a XML.El uso de atributos XML para controlar la serialización.

Si usted necesita para personalizar la serialización de la asamblea (y se necesidad de que a las clases de apoyo que no son IXmlSerializable y clases que contienen el resumen de los nodos), entonces instruir a sgen para volcar el código fuente en un archivo separado y, a continuación, añadir a su solución.A continuación, puede modificar según sea necesario.

http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

FWIW, me las he arreglado para serializar toda la AdsML Marco (más de 400 clases) el uso de esta técnica.Se exige un montón de personalización manual, pero no hay duda de que si se considera el tamaño del marco.(He utilizado una herramienta independiente para ir del XSD para C#)

Estoy de acuerdo en que la DataContract basado en métodos de serialización (a JSON, XML, etc) es un poco más compleja de lo que me gustaría.

Si usted está tratando de llegar a JSON retirar http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

Es parte de la MS extensiones de AJAX.Hay que admitir que es marcado como Obsoleto en .NET 3.5, pero ScottGu menciona en su blog un comentario aquí (http://weblogs.asp.net/scottgu/archive/2007/10/01/tip-trick-building-a-tojson-extension-method-using-net-3-5.aspx#4301973) que no está seguro de por qué y debe ser apoyado por un poco más de tiempo.

La cosa más simple de hacer es marcar sus objetos con el atributo Serializable y, a continuación, utilizar un formateador binario para controlar la serialización.Todo el gráfico de la clase no debería ser un problema siempre que los objetos contenidos también están marcados como Serializable.

Tal vez un camino más eficiente sería para serializar el uso de la BinaryFormatter

Como copiado de http://blog.paranoidferret.com/index.php/2007/04/27/csharp-tutorial-serialize-objects-to-a-file/

using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Serializer
{
   public Serializer()
   {
   }

   public void SerializeObject(string filename,
                  ObjectToSerialize objectToSerialize)
   {
      Stream stream = File.Open(filename, FileMode.Create);
      BinaryFormatter bFormatter = new BinaryFormatter();
      bFormatter.Serialize(stream, objectToSerialize);
      stream.Close();
   }

   public ObjectToSerialize DeSerializeObject(string filename)
   {
      ObjectToSerialize objectToSerialize;
      Stream stream = File.Open(filename, FileMode.Open);
      BinaryFormatter bFormatter = new BinaryFormatter();
      objectToSerialize =
         (ObjectToSerialize)bFormatter.Deserialize(stream);
      stream.Close();
      return objectToSerialize;
   }
}

Para la interoperabilidad siempre hemos usado Xml Seriación y aseguramos nuestra clase fue diseñada desde cero para hacerlo correctamente.

Vamos a crear un documento de esquema XSD y generar un conjunto de clases a partir de que el uso de XSD.exe.Esto genera que las clases parciales así que, a continuación, crear un conjunto de parcial correspondiente clases de añadir métodos que queremos que nos ayudan a rellenar las clases y el uso de ellos en nuestra aplicación (puesto que se centran en serialising y deserialising y son un poco difficut usar a veces).

Usted debe utilizar el NetDataContractSerializer.Cubre cualquier tipo de objeto gráfico y apoya a los genéricos, las listas, el polimorfismo (el KnownType atributo no es necesario aquí), la recursividad y etc.El único inconveniente es que tienes que marcar todas las clases con [Serializable] / [DataContract] atributos, pero la experiencia demuestra que usted tiene que hacer algún tipo de ajuste manual de todos modos, ya que no todos los miembros deben ser persistente.También se serializa en un Xml, aunque su lectura es cuestionable.

Teníamos los mismos requisitos como el tuyo y eligió esta solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top