Khi câu trả lời được chấp nhận cho biết, StringWriter
là UTF-16 (Unicode) theo mặc định và thiết kế. Nếu bạn muốn làm điều đó bằng cách nhận được một chuỗi UTF-8 cuối cùng, có 2 cách tôi có thể cung cấp cho bạn để hoàn thành nó:
Giải pháp # 1 (không thực sự rất hiệu quả, xấu, nhưng nhận được công việc thực hiện): Đổ nó vào một tập tin văn bản và đọc nó trở lại, xóa tập tin (có lẽ chỉ thích hợp cho các tập tin nhỏ, nếu bạn thậm chí muốn làm điều này cả - chỉ muốn hiển thị nó có thể được thực hiện!)
public static string SerializeObject<T>(this T value)
{
var serializer = new XmlSerializer(typeof(T));
var settings = new XmlWriterSettings
{
Encoding = new UTF8Encoding(true),
Indent = false,
OmitXmlDeclaration = false,
NewLineHandling = NewLineHandling.None
};
using(var xmlWriter = XmlWriter.Create("MyFile.xml", settings))
{
serializer.Serialize(xmlWriter, value);
}
XmlDocument xml = new XmlDocument();
xml.Load("MyFile.xml");
byte[] bytes = Encoding.UTF8.GetBytes(xml.OuterXml);
File.Delete("MyFile.xml");
return Encoding.UTF8.GetString(bytes);
}
giải pháp # 2 (tốt hơn, dễ dàng hơn, giải pháp thanh lịch hơn!): làm điều đó như bạn có nó, sử dụng StringWriter
, nhưng sử dụng nó Encoding
tài sản để thiết lập nó sang UTF-8:
public static string SerializeObject<T>(this T value)
{
var serializer = new XmlSerializer(typeof(T));
var settings = new XmlWriterSettings
{
Encoding = new UTF8Encoding(true),
Indent = false,
OmitXmlDeclaration = false,
NewLineHandling = NewLineHandling.None
};
using(var stringWriter = new StringWriter(Encoding.UTF8))
{
using(var xmlWriter = XmlWriter.Create(stringWriter, settings))
{
serializer.Serialize(xmlWriter, value);
}
return stringWriter.ToString();
}
}
thể trùng lặp của [Làm thế nào để đặt một thuộc tính mã hóa để xml khác mà utf-16 với XmlWriter?] (Http://stackoverflow.com/questions/427725/ làm thế nào để đặt-một-mã hóa-thuộc tính-to-xml-khác-mà-utf-16-với-xmlwriter) –
Tôi đã nhận ra rằng đây là một dupe, do đó, bỏ phiếu để đóng –