Không, bạn có thể sử dụng a StringWriter
để loại bỏ trung gian MemoryStream
. Tuy nhiên, để buộc nó thành XML, bạn cần sử dụng một mã StringWriter
ghi đè thuộc Encoding
tính:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
Hoặc nếu bạn chưa sử dụng C # 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Sau đó:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
Rõ ràng là bạn có thể tạo Utf8StringWriter
thành một lớp tổng quát hơn chấp nhận bất kỳ mã hóa nào trong hàm tạo của nó - nhưng theo kinh nghiệm của tôi UTF-8 cho đến nay là mã hóa "tùy chỉnh" được yêu cầu phổ biến nhất cho StringWriter
:)
Bây giờ là Jon Hanna nói, đây vẫn sẽ là UTF-16 trong nội bộ, nhưng có lẽ bạn sẽ vượt qua nó để cái gì khác tại một số điểm, để chuyển đổi nó thành dữ liệu nhị phân ... tại đó điểm bạn có thể sử dụng chuỗi trên, chuyển đổi nó thành UTF-8 byte và tất cả sẽ ổn - vì khai báo XML sẽ chỉ định "utf-8" làm mã hóa.
CHỈNH SỬA: Một ví dụ ngắn gọn nhưng đầy đủ để cho thấy điều này đang hoạt động:
using System;
using System.Text;
using System.IO;
using System.Xml.Serialization;
public class Test
{
public int X { get; set; }
static void Main()
{
Test t = new Test();
var serializer = new XmlSerializer(typeof(Test));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, t);
utf8 = writer.ToString();
}
Console.WriteLine(utf8);
}
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
}
Kết quả:
<?xml version="1.0" encoding="utf-8"?>
<Test xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<X>0</X>
</Test>
Lưu ý rằng mã hóa được khai báo của "utf-8" là những gì chúng tôi muốn, tôi tin.