いいえ、StringWriter
中間体を取り除くためにa を使用できます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
:)で最も一般的に必要な「カスタム」エンコードです。
これでJon Hannaが言うように、これは内部的にはまだ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」の宣言されたエンコーディングに注意してください。これは、私たちが望んでいたものだと思います。