Hayır, StringWriter
ara maddeden kurtulmak için a kullanabilirsiniz MemoryStream
. Ancak, bunu XML'e zorlamak StringWriter
için Encoding
özelliği geçersiz kılan a kullanmanız gerekir :
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
Veya henüz C # 6 kullanmıyorsanız:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Sonra:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
Açıkçası Utf8StringWriter
, yapıcısında herhangi bir kodlamayı kabul eden daha genel bir sınıf yapabilirsiniz - ancak benim deneyimime göre UTF-8, a için en sık gereken "özel" kodlamadır StringWriter
:)
Şimdi Jon Hanna'nın dediği gibi, bu yine de dahili olarak UTF-16 olacaktır, ancak muhtemelen bir noktada onu ikili veriye dönüştürmek için başka bir şeye aktaracaksınız ... bu noktada yukarıdaki dizeyi kullanabilirsiniz, bunu UTF-8 bayta dönüştürürseniz her şey iyi olacaktır - çünkü XML bildirimi kodlama olarak "utf-8" i belirtir.
DÜZENLEME: Bunun işe yaradığını göstermek için kısa ama eksiksiz bir örnek:
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;
}
}
Sonuç:
<?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>
İstediğimiz "utf-8" in beyan edilen kodlamasına dikkat edin, inanıyorum.