2012-04-10 5 views
10

Khi ghi vào luồng, DataContractSerializer sử dụng mã hóa khác với Unicode-16. Nếu tôi có thể ép nó viết/đọc Unicode-16, tôi có thể lưu trữ nó trong cột binary của SQL CE và đọc nó với SELECT CONVERT(nchar(1000), columnName). Nhưng theo cách của nó, tôi không thể đọc nó, ngoại trừ lập trình.Làm thế nào để thay đổi mã hóa văn bản DataContractSerializer?

Tôi có thể thay đổi mã hóa được sử dụng bởi System.Runtime.Serialization.DataContractSerializer không?

+0

Liên kết này có thể giúp bạn: http://sedodream.com/CategoryView,category,DataContractSerializer.aspx – Rajesh

Trả lời

10

Phương thức WriteObject của DataContractSerializer có quá tải ghi vào Stream hoặc đến XmlWriter (và XmlDictionaryWriter). Quá tải Stream sẽ mặc định là UTF-8, vì vậy bạn sẽ cần phải sử dụng thiết bị khác. Sử dụng một thể hiện XML Writer ghi XML trong UTF-16 làm những gì bạn cần, vì vậy bạn có thể làm những gì @Phil đề xuất, hoặc bạn có thể sử dụng tác giả trả về XmlDictionaryWriter.CreateTextWriter mà bạn chuyển một tham số 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

Đối tượng không được xác định - không đẹp. – Phil

+0

Chắc chắn, nó cần dọn dẹp. Nhưng tôi muốn giữ mã càng nhỏ càng tốt để tập trung vào câu hỏi là gì (cách sử dụng mã hóa khác để viết) trong khi vẫn đủ hoàn chỉnh để có thể tự chạy nó. – carlosfigueira

+0

Điều này không viết khai báo XML. Nếu bạn muốn điều này, hãy sử dụng XmlTextWriter, như trong câu trả lời này: http://stackoverflow.com/a/10089892/2279059 –

4

Bạn đã thử sử dụng XmlWriterSettings chưa? Một cái gì đó như

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

Xác định Encoding bạn yêu cầu.

+0

DataContractSerializer sẽ không ghi vào một XmlTextWriter. Nó biên dịch, nhưng không có gì được viết. –

+1

Nó hoạt động Ok cho tôi. Kiểm tra nhanh trong LINQPad với Encoding.Unicode cho thanh Phil

+0

Hãy thử cung cấp đường dẫn đầy đủ, không chỉ là 'test.xml', vì vậy bạn biết đầu ra sẽ kết thúc. – Phil