ไม่ได้คุณสามารถใช้ a StringWriter
เพื่อกำจัดตัวกลางMemoryStream
ได้ อย่างไรก็ตามในการบังคับให้เป็น XML คุณต้องใช้StringWriter
ซึ่งจะแทนที่Encoding
คุณสมบัติ:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
หรือหากคุณยังไม่ได้ใช้ C # 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
แล้ว:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
เห็นได้ชัดว่าคุณสามารถสร้างUtf8StringWriter
เป็นคลาสทั่วไปมากขึ้นซึ่งยอมรับการเข้ารหัสใด ๆ ในตัวสร้าง - แต่จากประสบการณ์ของฉัน UTF-8 เป็นการเข้ารหัสแบบ "กำหนดเอง" ที่จำเป็นที่สุดสำหรับStringWriter
:)
ขณะนี้เป็นจอนฮันนากล่าวว่านี้จะยังคงเป็น UTF-16 ภายใน แต่สันนิษฐานว่าคุณกำลังจะผ่านมันไปเป็นอย่างอื่นในบางจุดที่จะแปลงเป็นข้อมูลไบนารี ... ที่ว่าจุดที่คุณสามารถใช้สตริงข้างต้น แปลงเป็น UTF-8 ไบต์และทั้งหมดจะเป็นไปด้วยดี - เนื่องจากการประกาศ XML จะระบุ "utf-8" เป็นการเข้ารหัส
แก้ไข: ตัวอย่างสั้น ๆ แต่สมบูรณ์เพื่อแสดงการทำงานนี้:
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;
}
}
ผลลัพธ์:
<?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>
ฉันเชื่อว่าการเข้ารหัสที่ประกาศของ "utf-8" ซึ่งเป็นสิ่งที่เราต้องการ