如何更改DataContractSerializer文本编码?

Jad*_*ias 11 .net c# wcf serialization character-encoding

写入流时,DataContractSerializer使用与Unicode-16不同的编码.如果我可以强制它写/读Unicode-16,我可以将它存储在SQL CE的binary列中并用它读取SELECT CONVERT(nchar(1000), columnName).但是它的方式,除了编程之外我无法阅读它.

我可以更改使用的编码System.Runtime.Serialization.DataContractSerializer吗?

car*_*ira 12

DataContractSerializer的WriteObject方法具有写入a StreamXmlWriter(和XmlDictionaryWriter)的重载.在Stream过载将默认为UTF-8,所以你需要使用另一个.使用以UTF-16编写XML的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()));
    }
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*hil 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; }
}
Run Code Online (Sandbox Code Playgroud)

指定您需要的编码。