2009-07-31 9 views
18

¿alguien puede sugerir la mejor manera de serializar datos (una clase en realidad) a un DB?¿Serializar la clase C# directamente en el servidor SQL?

Estoy usando SQL Server 2008 pero supongo que necesito 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 muy apreciada

Respuesta

36

Puede xml serializar la clase en un campo XML. Usamos esto todo el tiempo para el registro de excepciones en un ETL.

Utilizando el XmlSerializer es posible que desee un método de ayuda en alguna parte, que serializa la clase a 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(); 
} 

A continuación, sólo hay que poner la cadena en el PP como cualquier otro.

+0

¿Por qué no pensar en usar un genérico para esto? * palma de la cara * –

+2

@tom - porque no hay necesidad de un genérico aquí. También podría usar el "valor del objeto" y luego llamar a "value.GetType()" al construir el serializador. –

+0

Gracias, finalmente lo hice, funciona como un regalo –

19

mejor forma de almacenar datos en una base de datos está en columnas (por propiedad), por lo que es consultable e indexable. Las herramientas ORM ayudarán con esto.

Sin embargo, es también es posible serializar una clase como un CLOB/BLOB (varchar(max)/varbinary(max) etc).

Esto es lo que desea, evite todo lo relacionado con la implementación o la versión intolerante; así que, en particular, no use 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 hago hincapié; las columnas serían mejores

+0

orujo - ¿por qué le aconsejamos que evite BinaryFormatter? es de menor tamaño ... Además, ¿cómo funciona la base contractual para mejorar los datos que se guardan en db? –

+0

@RoyiNamir puede tener problemas graves con el control de versiones, debido a que incluye nombres de tipos completos (incluidos ensamblajes), etc., y depende del campo. Tampoco es el más pequeño por una posibilidad remota. Por lo general, aconsejo a protobuf-net que usualmente es menos espacio * y * que evite todos los problemas anteriores, pero soy un poco parcial. –

+0

veo, pero todavía no entiendo el 'debido a la inclusión de nombres de tipo completo' .. ¿Qué pasa con eso? ¿Qué pasa si estoy almacenando el tipo (ejemplo: 'List ()') ... ¿me pueden explicar en una palabra o 2? Gracias. –

1

He serializado objetos como XML y los he metido en la base de datos sin problemas. Como sabíamos la cantidad máxima de texto, utilizamos el tipo de datos varchar (max) en lugar de ingresar a TEXT o Binary.

Esta era una aplicación web OLTP y una cosa que encontramos fue que al usar una columna con un tipo de datos xml se invocaba un uso significativo de la CPU ya que el xml se validaba en cada inserción. En nuestro caso, nunca se consultó el xml por nada, por lo que las capacidades de consulta xml no funcionaron bien para nosotros.

0

hay un par de opciones:

Runtime serialización, objetos serializables están marcados con el atributo Serializable , en cuyo caso la clase IFormatter hace todo el trabajo de serialización. Un objeto serializable puede ISerializable, pero luego tendrá que 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 el conocimiento de los tipos CLR.

serialización de Xml: serialización de tiempo de ejecución de línea, obtendrá una buena interoperabilidad en este caso. El tipo de XmlSerializer contiene los métodos Serialize() y Deserialize(), por lo tanto , cualquier objeto se puede serializar a XML y guardar en la base de datos y cuando lo recupera, puede deserializarlo fácilmente.

Para leer datos de la base de datos, puede utilizar el método de la clase SqlCommand que ejecuta consultas SQL, concretamente ExecuteXmlReader(). ExecuteXmlReader() devuelve una instancia de XmlReader y que leerá sus datos xml.

3

Sin genéricos (mejor sollution)

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(); 
} 
Cuestiones relacionadas