2012-04-10 9 views
10

Al escribir en una secuencia, el DataContractSerializer utiliza una codificación diferente de Unicode-16. Si pudiera forzarlo a escribir/leer Unicode-16 podría almacenarlo en una columna de SQL CE binary y leerlo con SELECT CONVERT(nchar(1000), columnName). Pero tal como es, no puedo leerlo, excepto programáticamente.¿Cómo cambiar la codificación de texto de DataContractSerializer?

¿Puedo cambiar la codificación utilizada por System.Runtime.Serialization.DataContractSerializer?

+0

Este enlace te pueden ayudar: http://sedodream.com/CategoryView,category,DataContractSerializer.aspx – Rajesh

Respuesta

10

El método del DataContractSerializer WriteObject tiene sobrecargas, que escriben a un Stream oa un XmlWriter (y XmlDictionaryWriter). La sobrecarga Stream tendrá como valor predeterminado UTF-8, por lo que deberá usar otra. El uso de una instancia de XML Writer que escribe el XML en UTF-16 hace lo que necesita, por lo que puede hacer lo que @Phil sugirió, o puede usar el escritor devuelto por XmlDictionaryWriter.CreateTextWriter para el cual pasa un Encoding.Unicode como parámetro.

public class StackOverflow_10089682 
{ 
    [DataContract(Name = "Person", Namespace = "http://my.namespace")] 
    public class Person 
    { 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public int Age { get; set; } 
    } 
    public static void Test() 
    { 
     MemoryStream ms = new MemoryStream(); 
     XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(ms, Encoding.Unicode); 
     DataContractSerializer dcs = new DataContractSerializer(typeof(Person)); 
     Person instance = new Person { Name = "John Doe", Age = 33 }; 
     dcs.WriteObject(writer, instance); 
     writer.Flush(); // Don't forget to Flush the writer here 
     Console.WriteLine("Decoding using UTF-16: {0}", Encoding.Unicode.GetString(ms.ToArray())); 
    } 
} 
+0

Objetos no expuestos: no son agradables. – Phil

+0

Claro, necesita limpieza. Pero prefiero mantener el código lo más pequeño posible para centrarme en cuál es la pregunta (cómo usar una codificación diferente para escribir) mientras esté lo suficientemente completa como para poder ejecutarla solo. – carlosfigueira

+0

Esto no escribe la declaración XML. Si desea esto, use XmlTextWriter, como en esta respuesta: http://stackoverflow.com/a/10089892/2279059 –

4

¿Has probado a usar XmlWriterSettings? Algo como

var s = new DataContractSerializer (typeof(Thing)); 

using(var wr = XmlTextWriter.Create(
    @"test.xml", new XmlWriterSettings{Encoding=Encoding.UTF32})) 
{ 
    s.WriteObject(wr, new Thing{Foo="bar"}); 
} 

public class Thing 
{ 
    public string Foo { get; set; } 
} 

Especifique la codificación que necesita.

+0

DataContractSerializer no escribirá a un XmlTextWriter. Compila, pero nada está escrito. –

+1

Funciona bien para mí. Prueba rápida en LINQPad con Encoding.Unicode da bar Phil

+0

Intente proporcionar una ruta completa, no solo 'test.xml', para saber dónde la salida está terminando. – Phil

Cuestiones relacionadas