Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XmlSerializer change encoding

Tags:

I am using this code to Serialize XML to 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(); } 

The problem is that i get :

<?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> 

There is any way to change the <?xml version="1.0" encoding="utf-16"?> to <?xml version="1.0" encoding="utf-8"?> ?

like image 620
YosiFZ Avatar asked Mar 17 '14 11:03

YosiFZ


2 Answers

Here is a code with encoding as parameter. Please read the comments why there is a SuppressMessage for code analysis.

/// <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's 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());     } } 
like image 139
pepo Avatar answered Oct 13 '22 05:10

pepo


Try this

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);         }     } 
like image 21
bmi Avatar answered Oct 13 '22 04:10

bmi