XmlSerializer изменение кодировки
Я использую этот код для Serialize
XML до String
:
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings
{
indent = true,
Encoding = Encoding.UTF8
};
using (var sw = new StringWriter())
{
using (XmlWriter xmlWriter = XmlWriter.Create(sw, xmlWriterSettings))
{
XmlSerializer xmlSerializer = new XmlSerializer(moviesObject.GetType(), new XmlRootAttribute("category"));
xmlSerializer.Serialize(xmlWriter, moviesObject);
}
return sw.ToString();
}
Проблема в том, что я получаю:
<?xml version="1.0" encoding="utf-16"?>
<category xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" havemore="no">
<items>
<movie>
<videoid>videoid1</videoid>
<title>title1</title>
</movie>
</items>
</category>
Есть какой-либо способ изменить <?xml version="1.0" encoding="utf-16"?>
в
<?xml version="1.0" encoding="utf-8"?>
?
Ответы
Ответ 1
Вот код с кодировкой как параметр. Пожалуйста, ознакомьтесь с комментариями, почему существует функция SuppressMessage для анализа кода.
/// <summary>
/// Serialize an object into an XML string
/// </summary>
/// <typeparam name="T">Type of object to serialize.</typeparam>
/// <param name="obj">Object to serialize.</param>
/// <param name="enc">Encoding of the serialized output.</param>
/// <returns>Serialized (xml) object.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
internal static String SerializeObject<T>(T obj, Encoding enc)
{
using (MemoryStream ms = new MemoryStream())
{
XmlWriterSettings xmlWriterSettings = new System.Xml.XmlWriterSettings()
{
// If set to true XmlWriter would close MemoryStream automatically and using would then do double dispose
// Code analysis does not understand that. That why there is a suppress message.
CloseOutput = false,
Encoding = enc,
OmitXmlDeclaration = false,
Indent = true
};
using (System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(ms, xmlWriterSettings))
{
XmlSerializer s = new XmlSerializer(typeof(T));
s.Serialize(xw, obj);
}
return enc.GetString(ms.ToArray());
}
}
Ответ 2
Решение прост:
Используйте класс StringWriter, который получен из StringWriter, и установите кодировку в конструкторе и перезапишите свойство Encoding базового класса:
public sealed class StringWriterWithEncoding : System.IO.StringWriter
{
private readonly System.Text.Encoding encoding;
public StringWriterWithEncoding(System.Text.StringBuilder sb) : base(sb)
{
this.encoding = System.Text.Encoding.Unicode;
}
public StringWriterWithEncoding(System.Text.Encoding encoding)
{
this.encoding = encoding;
}
public StringWriterWithEncoding(System.Text.StringBuilder sb, System.Text.Encoding encoding) : base(sb)
{
this.encoding = encoding;
}
public override System.Text.Encoding Encoding
{
get { return encoding; }
}
}
Затем просто передайте экземпляр StringWriterWithEnccoding в ваш метод:
public static string SerializeToXml<T>(T ThisTypeInstance)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
string strReturnValue = null;
//SerializeToXml<T>(ThisTypeInstance, new System.IO.StringWriter(sb));
SerializeToXml<T>(ThisTypeInstance, new StringWriterWithEncoding(sb, System.Text.Encoding.UTF8));
strReturnValue = sb.ToString();
sb = null;
return strReturnValue;
} // End Function SerializeToXml
Ответ 3
Попробуйте это
public static void SerializeXMLData(string pth, object xmlobj)
{
XmlSerializer serializer = new XmlSerializer(xmlobj.GetType());
using (XmlTextWriter tw = new XmlTextWriter(pth, Encoding.UTF8))
{
tw.Formatting = Formatting.Indented;
serializer.Serialize(tw, xmlobj);
}
}