2010-02-11 23 views
13

Recientemente tuve la necesidad de serializar un DataTable como una cadena para su posterior procesamiento (almacenamiento en un archivo).¿Cómo serializar una DataTable en una cadena?

Así que me pregunté: ¿cómo serializar una DataTable en una cadena?

+1

-1: Use 'XmlWriter.Create' en lugar de' new XmlTextWriter() ' –

+3

@Uwe Keim: Sí, está bien publicar fragmentos de código, pero aún así debe seguir el formato de pregunta/respuesta del sitio. Su pregunta sobre la serialización de una tabla de datos está bien, pero el fragmento de código debe publicarse por separado como una * respuesta *. Eso seguiría la guía de preguntas y respuestas, y también alentaría a otros a publicar sus propias respuestas. –

+0

¿Debería cambiarlo ahora, Bill? ¿O cuidar la guía para la próxima vez que publique? –

Respuesta

11

Aquí está el código que he escrito para llevar a cabo la tarea de la serialización de un DataTable en una cadena:

public static string SerializeTableToString(DataTable table) 
{ 
    if (table == null) 
    { 
     return null; 
    } 
    else 
    { 
     using (var sw = new StringWriter()) 
     using (var tw = new XmlTextWriter(sw)) 
     { 
      // Must set name for serialization to succeed. 
      table.TableName = @"MyTable"; 

      // -- 

      tw.Formatting = Formatting.Indented; 

      tw.WriteStartDocument(); 
      tw.WriteStartElement(@"data"); 

      ((IXmlSerializable)table).WriteXml(tw); 

      tw.WriteEndElement(); 
      tw.WriteEndDocument(); 

      // -- 

      tw.Flush(); 
      tw.Close(); 
      sw.Flush(); 

      return sw.ToString(); 
     } 
    } 
} 

Esperemos que esto es útil para alguien en algún lugar.

(Observe por favor que asked in the past si es OK para enviar fragmentos y se replica que éste debería estar bien; me corrija si estoy equivocado en la que - gracias!)

+0

¿Por qué no meterlo en un DataSet y guardarlo? No debe ser más de 2-3 líneas ... – leppie

+1

Esto fue, lo que probé primero. Para mi sorpresa, la referencia de DataSet del DataTable era NULL, así que usé esta solución. –

1

Yo sugeriría que no se va a serializar DataTable y use entidades personalizadas para persistencia/contratos para evitar difference in implementation details between .Net versions. El esquema XML de la clase DataTable es un detalle de implementación no documentado en el que no debe confiar.

+0

Buen punto, gracias por tu comentario. –

7

También puede intentar escribir el DataTable a XML, que funciona igual de bien:

Dim dt As DataTable 
Dim DataTableAsXMLString As String 
'...code to populate DataTable 
Using sw As New StringWriter()  
    dt.WriteXml(sw) 
    DataTableAsXMLString = sw.ToString() 
End Using 

... entonces si es necesario puede Convierta el XML de nuevo a una DataTable:

Dim ds As New DataSet 
Dim dt2 As DataTable 
Using sr As New StringReader(DataTableAsXMLString) 
    ds.ReadXml(sr) 
    dt2 = ds.Tables(0) 
End Using 
+3

Gracias por publicar también el proceso inverso. –

+0

Asegúrese de darle también un nombre a la tabla de datos ('dt.tableName =" MyDataTable "') antes de llamar a dt.WriteXml (sw); de lo contrario, obtendrá una excepción. – QFDev

+1

El código es incorrecto. 'dt.WriteXml (sw)' no devuelve una cadena. Necesita llamar a 'dt.WriteXml (sw)', luego 'DataTableAsXMLString = sw.ToString()' – nunzabar

Cuestiones relacionadas