Non, vous pouvez utiliser a StringWriter
pour vous débarrasser de l'intermédiaire MemoryStream
. Cependant, pour le forcer en XML, vous devez utiliser un StringWriter
qui remplace la Encoding
propriété:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
Ou si vous n'utilisez pas encore C # 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Ensuite:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
De toute évidence, vous pouvez créer Utf8StringWriter
une classe plus générale qui accepte n'importe quel encodage dans son constructeur - mais d'après mon expérience, UTF-8 est de loin l'encodage "personnalisé" le plus couramment requis pour un StringWriter
:)
Maintenant, comme le dit Jon Hanna, ce sera toujours UTF-16 en interne, mais vous allez probablement le passer à autre chose à un moment donné, pour le convertir en données binaires ... à ce stade, vous pouvez utiliser la chaîne ci-dessus, convertissez-le en octets UTF-8, et tout ira bien - car la déclaration XML spécifiera "utf-8" comme encodage.
EDIT: Un exemple court mais complet pour montrer ce fonctionnement:
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;
}
}
Résultat:
<?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>
Notez l'encodage déclaré de "utf-8" qui est ce que nous voulions, je crois.