c# - sinonimos - ¿Cuál es la serialización más flexible para objetos.NET, pero simple de implementar?
serialización en netbeans (12)
Me gustaría serializar y deserializar objetos sin tener que preocuparme por todo el gráfico de clase.
La flexibilidad es clave. Me gustaría poder serializar cualquier objeto que se me pase sin los atributos completos necesarios en todo el gráfico de objetos.
Eso significa que la serialización binaria no es una opción, ya que solo funciona con las otras plataformas .NET. También me gustaría algo legible por una persona, y así descifrable por un programa de gestión y otros intérpretes.
He encontrado problemas al utilizar los serializadores DataContract, JSON y XML.
- La mayoría de estos errores parecen centrarse en la serialización de listas / diccionarios (es decir, XML Serializable Generic Dictionary ).
- "Agregue cualquier tipo no conocido de forma estática a la lista de tipos conocidos, por ejemplo, utilizando el atributo KnownTypeAttribute o agregándolos a la lista de tipos conocidos pasados a DataContractSerializer".
Por favor, base sus respuestas en experiencias reales y no teoría o lectura de un artículo.
¿Ha considerado serializar a JSON en lugar de XML?
Json.NET tiene un serializador realmente potente y flexible que no tiene problemas con los diccionarios Hashtables / genéricos y no requiere ningún atributo en particular. Lo sé porque lo escribí :)
Le da un montón de control a través de varias opciones en el serializador y le permite anular cómo se serializa un tipo creando un JsonConverter para él.
En mi opinión, JSON es más legible que XML y Json.NET ofrece la opción de escribir JSON con buen formato.
Finalmente, el proyecto es de código abierto, por lo que puede ingresar al código y hacer modificaciones si lo necesita.
Acepto que los métodos de serialización basados en DataContract (a JSON, XML, etc.) son un poco más complejos de lo que me gustaría.
Si está intentando obtener JSON, consulte http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
Es parte de las extensiones MS AJAX. Es cierto que está marcado como obsoleto en .NET 3.5, pero ScottGu menciona en su comentario del blog 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 soportado por un tiempo más prolongado.
Coloque todas las clases que desea serializar en un ensamblaje por separado, y luego use la herramienta sgen para generar un conjunto de serialización para serializar en XML. Use atributos XML para controlar la serialización.
Si necesita personalizar el ensamblaje de serialización (y necesitará eso para admitir clases que no sean IXmlSerializable y clases que contengan nodos abstractos), entonces solicite a sgen que descargue el código fuente en un archivo separado y luego lo agregue a su solución. Entonces puedes modificarlo según sea necesario.
http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx
FWIW, he logrado serializar todo el Framework AdsML (más de 400 clases) usando esta técnica. Se requirió mucha personalización manual, pero no hay forma de evitarlo si se tiene en cuenta el tamaño del marco. (Utilicé una herramienta separada para pasar de XSD a C #)
Debe usar NetDataContractSerializer. Cubre cualquier tipo de gráfico de objetos y admite genéricos, listas, polimorfismo (el atributo KnownType no es necesario aquí), recursividad, etc. El único inconveniente es que debe marcar todas las clases con los atributos [Serializable] / [DataContract], pero la experiencia demuestra que tienes que hacer algún tipo de ajuste manual de todos modos, ya que no todos los miembros deben persistir. También serializa en un Xml, aunque su legibilidad es cuestionable.
Teníamos los mismos requisitos que los suyos y elegimos esta solución.
El IntermediateSerializer en el XNA Framework es bastante genial. Puede encontrar un montón de tutoriales sobre cómo usarlo en http://blogs.msdn.com/shawnhar
La serialización SOAP funcionó bien para mí, incluso para objetos no marcados con [Serializable]
Lo más simple es marcar sus objetos con el atributo Serializable y luego usar un formateador binario para manejar la serialización. El gráfico de clase completo no debería ser un problema siempre que cualquier objeto contenido también esté marcado como Serializable.
Para la interoperabilidad siempre hemos utilizado la Serialización Xml y nos aseguramos de que nuestra clase se haya diseñado desde cero para hacerlo correctamente.
Creamos un documento de esquema XSD y generamos un conjunto de clases a partir de eso usando XSD.exe. Esto genera clases parciales, entonces creamos un conjunto de clases parciales correspondientes para agregar los métodos adicionales que queremos para ayudarnos a poblar las clases y usarlas en nuestra aplicación (ya que están enfocadas en la serialización y deserialización y son un poco difíciles de usar algunas veces )
Quizás una ruta más eficiente sería serializar usando BinaryFormatter
Como se copió 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;
}
}
Según tus necesidades, parece que la serialización Xml es la mejor.
¿Qué tipo de problemas tienes con las colecciones al serializar? Si se refiere a no saber qué atributos usar en una Lista o algo similar, puede probar el atributo XmlArray en su propiedad. Definitivamente puede serializar una colección.
Si recuerdo, funciona algo como esto con una propiedad:
[XmlArray("Foo")]
[XmlArrayItem("Bar")]
public List<BarClass> FooBars
{ get; set; }
Si serializaste esto obtendrías algo así como:
<Foo>
<Bar />
<Bar />
</Foo>
Por supuesto, probablemente debería ceder ante los expertos. Aquí hay más información de MS: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlarrayitemattribute.aspx
Avíseme si eso funciona para usted.
Tendrá problemas con la serialización de colecciones si los objetos en la colección contienen alguna referencia a otros objetos en la misma colección. Si existe algún tipo de doble punteo, terminas creando un mapa múltiple que no se puede serializar. En todos los problemas que tuve al serializar una colección personalizada, siempre fue por alguna funcionalidad adicional que necesitaba que funcionaba bien como parte de una aplicación cliente-servidor "típica", y luego fracasaba miserablemente como parte de un proveedor de consumo aplicación de servidor.