2012-04-10 4 views
10

ストリームに書き込む場合、DataContractSerializerはUnicode-16とは異なるエンコーディングを使用します。 Unicode-16の書き込み/読み込みを強制することができれば、SQL CEのbinary列に格納してSELECT CONVERT(nchar(1000), columnName)と読むことができます。しかし、それは私がそれを読むことはできません。DataContractSerializerのテキストエンコーディングを変更するには?

System.Runtime.Serialization.DataContractSerializerで使用されるエンコーディングを変更することはできますか?

+0

このリンクはあなたを助けるかもしれない:http://sedodream.com/CategoryView,category,DataContractSerializer.aspx – Rajesh

答えて

10

DataContractSerializerのWriteObjectメソッドには、StreamまたはXmlWriter(およびXmlDictionaryWriter)に書き込むオーバーロードがあります。 StreamのオーバーロードはデフォルトでUTF-8になるため、別のものを使用する必要があります。 UTF-16でXMLを書き込むXML Writerインスタンスを使用すると、必要な処理を行うことができるので、@Philが提案したものを実行するか、によって返されたwriterを使用して、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

未配置のオブジェクト - 素晴らしいものではありません。 – Phil

+0

もちろん、清掃が必要です。しかし、私はむしろ問題が何であるかに焦点を当てるためにコードをできるだけ小さくしておきたいと思います。 – carlosfigueira

+0

これはXML宣言を記述しません。これを行うには、この回答のようにXmlTextWriterを使用します。http://stackoverflow.com/a/10089892/2279059 –

4

XmlWriterSettingsを使ってみましたか?何かのように

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

あなたが必要とするエンコーディングを指定してください。

+0

DataContractSerializerてXmlTextWriterに書き込めません。それはコンパイルされますが、何も書かれていません。 –

+1

それは私のためにうまく動作します。 Encoding.Unicodeを使用したLINQPadのクイックテストでは、<?xml version = "1.0" encoding = "utf-16"?> bar Phil

+0

「test.xml」だけでなく、完全なパスを指定してみてください。出力が終了します。 – Phil

関連する問題