Tidak, Anda dapat menggunakan a StringWriter
untuk menghilangkan perantara MemoryStream
. Namun, untuk memaksanya ke dalam XML, Anda perlu menggunakan a StringWriter
yang menggantikan Encoding
properti:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
Atau jika Anda belum menggunakan C # 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Kemudian:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
Jelas Anda dapat membuat Utf8StringWriter
kelas yang lebih umum yang menerima pengkodean apa pun dalam konstruktornya - tetapi menurut pengalaman saya UTF-8 sejauh ini merupakan pengkodean "khusus" yang paling umum diperlukan untuk StringWriter
:)
Sekarang sebagai Jon Hanna mengatakan, ini masih akan UTF-16 internal, tapi mungkin Anda akan menyebarkannya ke sesuatu yang lain di beberapa titik, untuk mengubahnya menjadi data biner ... pada yang titik Anda dapat menggunakan string di atas, mengonversinya menjadi byte UTF-8, dan semuanya akan baik-baik saja - karena deklarasi XML akan menentukan "utf-8" sebagai pengkodeannya.
EDIT: Contoh singkat tapi lengkap untuk menunjukkan ini berfungsi:
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;
}
}
Hasil:
<?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>
Perhatikan pengkodean yang dideklarasikan dari "utf-8" yang kami inginkan, saya yakin.