2012-04-10 18 views
10

Quando si scrive su uno stream, DataContractSerializer utilizza una codifica diversa da Unicode-16. Se potessi forzarlo a scrivere/leggere Unicode-16, potrei memorizzarlo nella colonna binary di SQL CE e leggerlo con SELECT CONVERT(nchar(1000), columnName). Ma così com'è, non posso leggerlo, se non programmaticamente.Come modificare la codifica del testo DataContractSerializer?

Posso modificare la codifica utilizzata da System.Runtime.Serialization.DataContractSerializer?

+0

Questo collegamento potrebbe aiutare: http://sedodream.com/CategoryView,category,DataContractSerializer.aspx – Rajesh

risposta

10

metodo del DataContractSerializer WriteObject ha sovraccarichi che scrivono un Stream oa un XmlWriter (e XmlDictionaryWriter). Il sovraccarico dello Stream sarà impostato su UTF-8, quindi sarà necessario utilizzarne un altro. Usando un'istanza XML Writer che scrive l'XML in UTF-16 fai ciò di cui hai bisogno, così puoi fare ciò che @Phil ha suggerito, oppure puoi usare il writer restituito da XmlDictionaryWriter.CreateTextWriter per il quale si passa un parametro Encoding.Unicode.

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

Oggetti non esposti: non è bello. – Phil

+0

Certo, ha bisogno di essere pulito. Ma preferirei mantenere il codice il più piccolo possibile per concentrarmi su quale sia la domanda (come usare una codifica diversa per la scrittura) mentre è ancora abbastanza completa da poter essere eseguita da sola. – carlosfigueira

+0

Questo non scrive la dichiarazione XML. Se vuoi, usa XmlTextWriter, come in questa risposta: http://stackoverflow.com/a/10089892/2279059 –

4

Hai provato a utilizzare XmlWriterSettings? Qualcosa come

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; } 
} 

Specificare la codifica richiesta.

+0

DataContractSerializer non scriverà a un XmlTextWriter. Compilare, ma non viene scritto nulla. –

+1

Funziona Ok per me. Test rapido in LINQPad con Encoding.Unicode fornisce bar Phil

+0

Prova a fornire un percorso completo, non solo" test.xml ", quindi sai dove l'output sta finendo. – Phil

Problemi correlati