Nein, Sie können a verwenden StringWriter
, um das Zwischenprodukt loszuwerden MemoryStream
. Um es jedoch in XML zu erzwingen, müssen Sie ein verwenden, StringWriter
das die Encoding
Eigenschaft überschreibt :
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
Oder wenn Sie C # 6 noch nicht verwenden:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Dann:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
Natürlich können Sie Utf8StringWriter
eine allgemeinere Klasse erstellen, die jede Codierung in ihrem Konstruktor akzeptiert - aber meiner Erfahrung nach ist UTF-8 bei weitem die am häufigsten erforderliche "benutzerdefinierte" Codierung für eine StringWriter
:)
Nun, wie Jon Hanna sagt, wird dies intern immer noch UTF-16 sein, aber vermutlich werden Sie es irgendwann an etwas anderes übergeben, um es in Binärdaten umzuwandeln ... an diesem Punkt können Sie die obige Zeichenfolge verwenden, Konvertieren Sie es in UTF-8-Bytes, und alles wird gut - da in der XML-Deklaration "utf-8" als Codierung angegeben wird.
EDIT: Ein kurzes, aber vollständiges Beispiel, um diese Arbeitsweise zu zeigen:
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;
}
}
Ergebnis:
<?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>
Beachten Sie die deklarierte Codierung von "utf-8", die wir meiner Meinung nach wollten.