12

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

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

4

2 に答える 2

13

DataContractSerializer のWriteObjectメソッドには、StreamまたはXmlWriter(およびXmlDictionaryWriter) に書き込むオーバーロードがあります。オーバーStreamロードはデフォルトで UTF-8 になるため、別のものを使用する必要があります。XML を UTF-16 で書き込む XML Writer インスタンスを使用すると、必要なことを実行できるため、@Phil が提案したことを実行するか、パラメーターとしてXmlDictionaryWriter.CreateTextWriter渡すために返されたライターを使用でき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()));
    }
}
于 2012-04-10T15:37:31.197 に答える
5

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

必要なエンコーディングを指定します。

于 2012-04-10T13:37:10.580 に答える