XmlSerializer encoding change

I use this code for Serialize XML before 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 what 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> 

Is there any way to change <?xml version="1.0" encoding="utf-16"?> <?xml version="1.0" encoding="utf-8"?> ?

+11
c # xml
Mar 17 '14 at 11:23
source share
3 answers

Here is the encoded code as a parameter. Please see the comments on why the SuppressMessage function exists 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 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()); } } 
+11
Mar 17 '14 at 13:46
source share

The solution is simple:
Use the StringWriter class, which is derived from StringWriter, and set the encoding in the constructor and overwrite the Encoding property of the base class:

 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; } } } 

Then just pass the StringWriterWithEnccoding instance to your method:

 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 
+2
Aug 27 '15 at 21:20
source share

try it

 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); } } 
+1
Mar 17 '14 at 11:45
source share