tipos - ¿Serializar la clase C#directamente al servidor SQL?
tipo tinyint sql server (6)
Consulte Linq-to-SQL ( preguntas sobre SO , recurso en MSDN ) u otras opciones de asignación OR .
¿Alguien puede sugerir la mejor manera de serializar datos (una clase en realidad) a una base de datos?
Estoy utilizando SQL Server 2008, pero supongo que debo serializar la clase a una cadena u otro tipo de datos antes de almacenar en la base de datos.
Supongo que este campo debe ser de texto o binario ??
¿SQL Server 2008 (o .net 3.5) admite la serialización directamente en la base de datos?
Cualquier ayuda realmente apreciada
Hay un par de opciones:
Serialización en tiempo de ejecución, los objetos serializables están marcados con el atributo Serializable, en cuyo caso la clase IFormatter realiza todo el trabajo de serialización. Un objeto serializable puede ISerializable, pero entonces necesitará implementar el método GetObjectData (). El problema con la serialización en tiempo de ejecución es que el programa que lee los datos xml necesita tener conocimiento de los tipos CLR.
Xml serialización: Unline runtime serialización, obtendrá una buena interoperabilidad en este caso. El tipo XmlSerializer contiene los métodos Serialize () y Deserialize (), por lo tanto, cualquier objeto puede ser serializado a XML y guardado en la base de datos y cuando lo recupere, puede deserializarlo fácilmente.
Para leer datos de la base de datos, puede usar el método de clase SqlCommand que ejecuta consultas SQL, a saber, ExecuteXmlReader (). ExecuteXmlReader () devuelve una instancia de XmlReader y leerá sus datos xml.
He serializado objetos como XML y los he lanzado a la base de datos muy bien. Como sabíamos la cantidad máxima de texto, usamos el tipo de datos varchar (max) en lugar de entrar en formato TEXTO o Binario.
Esta fue una aplicación web OLTP y una cosa que encontramos fue que el uso de una columna con un tipo de datos xml invocó un uso significativo de CPU ya que el xml se validó en cada inserción. En nuestro caso, el xml nunca fue consultado por nada, por lo que no tener las capacidades de consulta xml funcionó bien para nosotros.
La mejor manera de almacenar datos en una base de datos es en columnas (por propiedad), de modo que puedan consultarse e indexarse. Las herramientas de ORM ayudarán con esto.
Sin embargo, también es posible serializar una clase como CLOB / BLOB ( varchar(max)
/ varbinary(max)
etc.).
Esto es lo que quiere, evite cualquier implementación específica o intolerante a la versión; así que, en particular, no utilice BinaryFormatter
. Cualquier cosa basada en un contrato debería funcionar; XmlSerializer
, DataContractSerializer
, etc. O para binarios rápidos, vale la pena ver protobuf-net.
Pero subrayo; Las columnas serían mejores.
Puede xml serializar la clase en un campo xml. Usamos esto todo el tiempo para el registro de excepciones en un ETL.
Usando el XmlSerializer usted puede querer un método auxiliar en algún lugar que serialice la clase en una cadena ...
public static string SerializeToXml<T>(T value)
{
StringWriter writer = new StringWriter(CultureInfo.InvariantCulture);
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(writer, value);
return writer.ToString();
}
Luego simplemente coloca la cadena en la db como cualquier otra.
Sin genéricos (mejor solución).
public static string SerializeToXml(object value)
{
StringWriter writer = new StringWriter(CultureInfo.InvariantCulture);
XmlSerializer serializer = new XmlSerializer(value.GetType());
serializer.Serialize(writer, value);
return writer.ToString();
}