Zgodnie z zaakceptowaną odpowiedzią, StringWriter
jest domyślnie UTF-16 (Unicode) i konstrukcja. Jeśli chcesz to zrobić, uzyskując ciąg znaków UTF-8 na końcu, możesz to zrobić na dwa sposoby:
Rozwiązanie nr 1 (niezbyt wydajna, zła praktyka, ale dostaje pracę done): Zrzuć go do pliku tekstowego i wczytaj ponownie, usuń plik (prawdopodobnie tylko dla małych plików, jeśli nawet chcesz to zrobić - po prostu chciałeś pokazać, że to może być zrobione!)
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);
}
rozwiązanie nr 2 (lepiej, łatwiej, bardziej eleganckie rozwiązanie!): Zrób to jak masz to, za pomocą StringWriter
, ale używać jej Encoding
właściwość, aby ustawić go na 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 StringWriter(Encoding.UTF8))
{
using(var xmlWriter = XmlWriter.Create(stringWriter, settings))
{
serializer.Serialize(xmlWriter, value);
}
return stringWriter.ToString();
}
}
możliwe duplikat [Jak umieścić atrybut kodowania do formatu XML inny, że UTF-16 z XmlWriter?] (Http://stackoverflow.com/questions/427725/ how-to-put-an-encoding-attribute-to-xml-other-that-utf-16-with-xmlwriter) –
Zdałem sobie sprawę, że to jest dupe, więc głosuj na zamknięcie –