using System; using System.Text; using System.IO; using System.Xml; using System.Xml.Serialization; using System.Xml.Schema; namespace Volian.Base.Library { public static class GenericSerializer where T : class { public static string StringSerialize(T t) { string strOutput = string.Empty; XmlSerializer xs = new XmlSerializer(typeof(T)); using (MemoryStream ms = new MemoryStream()) { xs.Serialize(new NonXsiTextWriter(ms, Encoding.Unicode), t); ms.Position = 0; StreamReader sr = new StreamReader(ms); strOutput = sr.ReadToEnd(); ms.Close(); } return strOutput; } public static T StringDeserialize(string s) { T t; string ss = s.Replace("encoding=\"utf-16\"", ""); XmlSerializer xs = new XmlSerializer(typeof(T)); UTF8Encoding enc = new UTF8Encoding(); Byte[] arrBytData = enc.GetBytes(ss); using (MemoryStream ms = new MemoryStream(arrBytData)) { t = (T)xs.Deserialize(ms); } return t; } } public class NonXsiTextWriter : XmlTextWriter { public NonXsiTextWriter(TextWriter w) : base(w) { } public NonXsiTextWriter(Stream w, Encoding encoding) : base(w, encoding) { this.Formatting = Formatting.Indented; } public NonXsiTextWriter(string filename, Encoding encoding) : base(filename, encoding) { } bool _skip = false; public override void WriteStartAttribute(string prefix, string localName, string ns) { if ((prefix == "xmlns" && (localName == "xsd" || localName == "xsi")) || // Omits XSD and XSI declarations. ns == XmlSchema.InstanceNamespace) // Omits all XSI attributes. { _skip = true; return; } if (localName == "xlink_href") base.WriteStartAttribute(prefix, "xlink:href", ns); else base.WriteStartAttribute(prefix, localName, ns); } public override void WriteString(string text) { if (_skip) return; base.WriteString(text); } public override void WriteEndAttribute() { if (_skip) { // Reset the flag, so we keep writing. _skip = false; return; } base.WriteEndAttribute(); } } }