Não, você pode usar um StringWriter
para se livrar do intermediário MemoryStream
. No entanto, para forçá-lo em XML, você precisa usar um StringWriter
que substitui a Encoding
propriedade:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
Ou se ainda não estiver usando o C # 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Então:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
Obviamente, você pode fazer Utf8StringWriter
em uma classe mais geral que aceita qualquer codificação em seu construtor - mas na minha experiência UTF-8 é de longe a codificação "personalizada" mais comumente necessária para um StringWriter
:)
Agora, como Jon Hanna disse, isso ainda será UTF-16 internamente, mas provavelmente você vai passá-lo para outra pessoa em algum ponto, para convertê-lo em dados binários ... nesse ponto, você pode usar a string acima, converta-o em bytes UTF-8 e tudo ficará bem - porque a declaração XML especificará "utf-8" como a codificação.
EDIT: Um exemplo curto, mas completo para mostrar isso funcionando:
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;
}
}
Resultado:
<?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>
Observe a codificação declarada de "utf-8" que é o que queríamos, eu acredito.