Нет, вы можете использовать a, StringWriter
чтобы избавиться от промежуточного звена MemoryStream
. Однако, чтобы принудительно преобразовать его в XML, вам нужно использовать, StringWriter
который переопределяет Encoding
свойство:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding => Encoding.UTF8;
}
Или, если вы еще не используете C # 6:
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Затем:
var serializer = new XmlSerializer(typeof(SomeSerializableObject));
string utf8;
using (StringWriter writer = new Utf8StringWriter())
{
serializer.Serialize(writer, entry);
utf8 = writer.ToString();
}
Очевидно, вы можете создать Utf8StringWriter
более общий класс, который принимает любую кодировку в своем конструкторе, но, по моему опыту, UTF-8 является наиболее часто требуемой "пользовательской" кодировкой для a StringWriter
:)
Теперь, как говорит Джон Ханна, внутренне это все еще будет UTF-16, но, предположительно, в какой-то момент вы собираетесь передать его чему-то еще, чтобы преобразовать его в двоичные данные ... в этот момент вы можете использовать указанную выше строку, преобразуйте его в байты UTF-8, и все будет хорошо, потому что объявление XML будет указывать в качестве кодировки «utf-8».
РЕДАКТИРОВАТЬ: короткий, но полный пример, показывающий, как это работает:
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;
}
}
Результат:
<?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>
Обратите внимание на заявленную кодировку «utf-8», что, я считаю, именно то, что мы хотели.