Как говорится в принятом ответе, StringWriter
- это UTF-16 (Unicode) по умолчанию и в дизайне. Если вы хотите сделать это, получив в конце строку UTF-8, я могу дать вам два способа сделать это:
Решение № 1 (не очень эффективно, плохая практика, но выполняет свою работу): Скопируйте его в текстовый файл и прочитайте обратно, удалите файл (возможно, подходит только для маленькие файлы, если вы вообще хотите это сделать - просто хотели показать, что это возможно!)
public static string SerializeObject<T>(this T value)
{
var serializer = new XmlSerializer(typeof(T));
var settings = new XmlWriterSettings
{
Encoding = new UTF8Encoding(true),
Indent = false,
OmitXmlDeclaration = false,
NewLineHandling = NewLineHandling.None
};
using(var xmlWriter = XmlWriter.Create("MyFile.xml", settings))
{
serializer.Serialize(xmlWriter, value);
}
XmlDocument xml = new XmlDocument();
xml.Load("MyFile.xml");
byte[] bytes = Encoding.UTF8.GetBytes(xml.OuterXml);
File.Delete("MyFile.xml");
return Encoding.UTF8.GetString(bytes);
}
Решение № 2 (лучше, проще, более элегантное решение!): Сделайте так, как у вас, используя StringWriter
, но используйте его свойство Encoding
, чтобы установить его в UTF-8:
public static string SerializeObject<T>(this T value)
{
var serializer = new XmlSerializer(typeof(T));
var settings = new XmlWriterSettings
{
Encoding = new UTF8Encoding(true),
Indent = false,
OmitXmlDeclaration = false,
NewLineHandling = NewLineHandling.None
};
using(var stringWriter = new UTF8StringWriter())
{
using(var xmlWriter = XmlWriter.Create(stringWriter, settings))
{
serializer.Serialize(xmlWriter, value);
}
return stringWriter.ToString();
}
}
public class UTF8StringWriter : StringWriter
{
public override Encoding Encoding
{
get
{
return Encoding.UTF8;
}
}
}