Nie, możesz użyć a, StringWriter
aby pozbyć się półproduktu MemoryStream
. Jednak, aby wymusić na XML, musisz użyć a, StringWriter
który zastępuje Encoding
właściwość:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
Lub jeśli jeszcze nie używasz C # 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Następnie:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
Oczywiście możesz uczynić Utf8StringWriter
bardziej ogólną klasę, która akceptuje dowolne kodowanie w swoim konstruktorze - ale z mojego doświadczenia wynika, że UTF-8 jest zdecydowanie najczęściej wymaganym "niestandardowym" kodowaniem dla StringWriter
:)
Teraz, jak mówi Jon Hanna, nadal będzie to wewnętrznie UTF-16, ale prawdopodobnie w pewnym momencie przekażesz go do czegoś innego, aby przekonwertować go na dane binarne ... w tym momencie możesz użyć powyższego ciągu, przekonwertuj go na bajty UTF-8 i wszystko będzie dobrze - ponieważ deklaracja XML określi "utf-8" jako kodowanie.
EDYCJA: Krótki, ale kompletny przykład pokazujący, jak działa:
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;
}
}
Wynik:
<?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>
Zwróć uwagę na deklarowane kodowanie „utf-8”, które, jak sądzę, było tym, czego chcieliśmy.