Как изменить текстовое кодирование DataContractSerializer?

При записи в поток DataContractSerializer используется кодировка, отличная от Unicode-16. Если бы я мог заставить его писать/читать Unicode-16, я мог бы хранить его в столбце SQL CE binary и читать его с помощью SELECT CONVERT(nchar(1000), columnName). Но так оно и есть, я не могу его прочитать, кроме программно.

Можно ли изменить кодировку, используемую System.Runtime.Serialization.DataContractSerializer?

Ответ 1

Метод DataContractSerializer WriteObject имеет перегрузки, которые записываются в Stream или в XmlWriterXmlDictionaryWriter). Перегрузка Stream будет по умолчанию UTF-8, поэтому вам нужно будет использовать другую. Используя экземпляр XML Writer, который пишет XML в UTF-16, сделайте то, что вам нужно, чтобы вы могли либо сделать то, что предложили @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()));
    }
}

Ответ 2

Пробовали ли вы использовать 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; }
}

Укажите требуемую кодировку.