Ні, ви можете використовувати 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 - це, безумовно, найчастіше необхідне "власне" кодування для StringWriter
:)
Тепер, як каже Джон Ханна, це все одно буде UTF-16 внутрішньо, але, мабуть, ви збираєтесь передати його в щось інше, щоб перетворити його у бінарні дані ... у цей момент ви можете використовувати вищевказаний рядок, конвертуйте його в байти UTF-8, і все буде добре - адже в декларації XML буде вказано "utf-8" як кодування.
EDIT: Короткий, але повний приклад, щоб показати це:
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", яке ми хотіли, я вважаю.