No, puede usar a StringWriter
para deshacerse del intermedio MemoryStream
. Sin embargo, para forzarlo a XML, debe usar un StringWriter
que anule la Encoding
propiedad:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
O si aún no está usando C # 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Luego:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
Obviamente, puede convertirlo Utf8StringWriter
en una clase más general que acepte cualquier codificación en su constructor, pero en mi experiencia, UTF-8 es, con mucho, la codificación "personalizada" más comúnmente requerida para un StringWriter
:)
Ahora, como dice Jon Hanna, esto seguirá siendo UTF-16 internamente, pero presumiblemente lo pasará a otra cosa en algún momento, para convertirlo en datos binarios ... en ese momento puede usar la cadena anterior, conviértalo en bytes UTF-8 y todo estará bien, porque la declaración XML especificará "utf-8" como codificación.
EDITAR: Un ejemplo breve pero completo para mostrar este funcionamiento:
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>
Tenga en cuenta la codificación declarada de "utf-8" que es lo que queríamos, creo.