2009-06-09 23 views
15

Tôi đang cố gắng tạo một đoạn xml. Tôi đã tạo dataclasses với xsd.exe. Lớp gốc là MESSAGE.XmlTextWriter serialization problem

Vì vậy, sau khi tạo một MESSAGE và điền tất cả các thuộc tính của nó, tôi serialize nó như thế này:

serializer = new XmlSerializer(typeof(Xsd.MESSAGE)); 
StringWriter sw = new StringWriter(); 
serializer.Serialize(sw, response); 
string xml = sw.ToString(); 

Cho đến nay mọi việc suôn sẻ, chuỗi xml chứa hợp lệ (UTF-16 mã hóa) xml. Bây giờ tôi muốn tạo xml với mã UTF-8 thay vào đó, vì vậy tôi làm điều đó như thế này:

Sửa: quên bao gồm việc kê khai của con suối

serializer = new XmlSerializer(typeof(Xsd.MESSAGE)); 
using (MemoryStream stream = new MemoryStream()) 
{ 
    XmlTextWriter xtw = new XmlTextWriter(stream, Encoding.UTF8); 
    serializer.Serialize(xtw, response); 
    string xml = Encoding.UTF8.GetString(stream.ToArray()); 
} 

Và ở đây có vấn đề : Sử dụng phương pháp này, chuỗi xml được thêm vào trước với một char không hợp lệ (hình vuông nổi tiếng).
Khi tôi kiểm tra việc char như thế này:

char c = xml[0]; 

Tôi có thể thấy rằng c có giá trị 65279.
Bất kỳ ai có một đầu mối, nơi này đến từ đâu?
tôi có thể dễ dàng giải quyết điều này bằng cách cắt đứt các char đầu tiên:

xml = xml.SubString(1); 

Nhưng tôi thà biết những gì đang diễn ra bên ngoài một cách mù quáng cắt của char đầu tiên.

Mọi người đều có thể làm sáng tỏ điều này? Cảm ơn!

+0

Xem: http://stackoverflow.com/questions/955611/xmlwriter-to-write-to-a -string-instead-of-a-file/955698 # 955698 –

Trả lời

15

Dưới đây là mã của bạn sửa đổi để không thêm vào trước các byte-trật tự-mark (BOM):

var serializer = new XmlSerializer(typeof(Xsd.MESSAGE)); 
Encoding utf8EncodingWithNoByteOrderMark = new UTF8Encoding(false); 
XmlTextWriter xtw = new XmlTextWriter(stream, utf8EncodingWithNoByteOrderMark); 
serializer.Serialize(xtw, response); 
string xml = Encoding.UTF8.GetString(stream.ToArray()); 
+0

Tôi đã sử dụng giải pháp này, vì vậy tôi đã chấp nhận câu trả lời này. Cảm ơn! – fretje

6

65279 là dấu thứ tự byte Unicode - bạn có chắc là bạn đang nhận được 65249 không? Giả sử nó thực sự BOM, bạn có thể loại bỏ nó bằng cách tạo một cá thể UTF8Encoding không sử dụng BOM. (Xem quá tải hàm dựng để biết chi tiết.)

Tuy nhiên, có cách dễ dàng hơn để nhận UTF-8. Bạn có thể sử dụng StringWriter, nhưng một lớp dẫn xuất ghi đè thuộc tính Encoding. Xem this answer để biết ví dụ.

+0

Tôi cũng đã chạy mã và nhận được 65279. Có lẽ là lỗi đánh máy trong câu hỏi. –

+0

Một lỗi đánh máy thực sự ... được cập nhật ;-) – fretje

+0

BOM: Xem http://en.wikipedia.org/wiki/Byte-order_mark –