No, puoi usare a StringWriter
per sbarazzarti dell'intermedio MemoryStream
. Tuttavia, per forzarlo in XML è necessario utilizzare un StringWriter
che sovrascrive la Encoding
proprietà:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
O se non stai ancora usando C # 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Poi:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
Ovviamente puoi trasformare Utf8StringWriter
in una classe più generale che accetta qualsiasi codifica nel suo costruttore - ma nella mia esperienza UTF-8 è di gran lunga la codifica "personalizzata" più comunemente richiesta per un StringWriter
:)
Ora, come dice Jon Hanna, questo sarà ancora UTF-16 internamente, ma presumibilmente lo passerai a qualcos'altro ad un certo punto, per convertirlo in dati binari ... a quel punto puoi usare la stringa sopra, convertitelo in byte UTF-8 e tutto andrà bene, perché la dichiarazione XML specificherà "utf-8" come codifica.
EDIT: un esempio breve ma completo per mostrare questo funzionamento:
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;
}
}
Risultato:
<?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>
Notare la codifica dichiarata di "utf-8" che è quello che volevamo, credo.