2012-04-10 1 views
10

Beim Schreiben in einen Stream verwendet die DataContractSerializer eine andere Codierung als Unicode-16. Wenn ich es zwingen könnte, Unicode-16 zu schreiben/zu lesen, könnte ich es in einer binary Spalte von SQL CE speichern und es mit SELECT CONVERT(nchar(1000), columnName) lesen. Aber so wie es ist, kann ich es nicht lesen, außer programmatisch.Wie ändert man die Textverschlüsselung des DataContractSerializers?

Kann ich die von System.Runtime.Serialization.DataContractSerializer verwendete Codierung ändern?

+0

Dieser Link könnte Ihnen helfen: http://sedodream.com/CategoryView,category,DataContractSerializer.aspx – Rajesh

Antwort

10

WriteObject Die Methode des DataContractSerializer hat Überlastungen, die zu einem Stream oder ein XmlWriter (und XmlDictionaryWriter) schreiben. Die Stream Überladung wird standardmäßig auf UTF-8 eingestellt, Sie müssen also eine andere verwenden. Wenn Sie eine XML Writer-Instanz verwenden, die das XML in UTF-16 schreibt, tun Sie, was Sie benötigen, also können Sie entweder das tun, was @Phil vorgeschlagen hat, oder Sie können den von XmlDictionaryWriter.CreateTextWriter zurückgegebenen Writer verwenden, für den Sie einen Encoding.Unicode als Parameter übergeben.

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

Nicht verschobene Objekte - nicht nett. – Phil

+0

Sicher, es muss aufgeräumt werden. Aber ich würde den Code lieber so klein wie möglich halten, um mich auf die Frage zu konzentrieren (wie man eine andere Kodierung für das Schreiben verwendet), solange sie noch so vollständig ist, dass sie selbst ausgeführt werden kann. – carlosfigueira

+0

Dies schreibt die XML-Deklaration nicht. Wenn Sie dies möchten, verwenden Sie XmlTextWriter, wie in dieser Antwort: http://StackOverflow.com/a/10089892/2279059 –

4

Haben Sie versucht, XmlWriterSettings zu verwenden? So etwas wie

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

Geben Sie die Codierung an, die Sie benötigen.

+0

DataContractSerializer nicht zu einem XmlTextWriter schreiben. Es kompiliert, aber nichts ist geschrieben. –

+1

Es funktioniert Ok für mich. Schnelltest in LINQPad mit Encoding.Unicode gibt bar Phil

+0

Versuchen Sie, einen vollständigen Pfad anzugeben, nicht nur "test.xml", damit Sie wissen, wo Die Ausgabe endet. – Phil

Verwandte Themen