using System; using System.Collections.Generic; using System.Text; using System.Xml.Serialization; using System.Xml; using System.Xml.Schema; using System.IO; namespace Volian.Svg.Library { public static class SvgSerializer where T : class { public static string StringSerialize(T t) { string strOutput = string.Empty; XmlSerializer xs = new XmlSerializer(typeof(T),"http://www.w3.org/2000/svg"); using (MemoryStream ms = new MemoryStream()) { xs.Serialize( new NonXsiTextWriter(ms,Encoding.UTF8), t); //xs.Serialize(ms, t); ms.Position = 0; StreamReader sr = new StreamReader(ms); strOutput = sr.ReadToEnd(); ms.Close(); } return strOutput; } public static T StringDeserialize(string s) { T t; XmlSerializer xs = new XmlSerializer(typeof(T), "http://www.w3.org/2000/svg"); UTF8Encoding enc = new UTF8Encoding(); Byte[] arrBytData = enc.GetBytes(s); using (MemoryStream ms = new MemoryStream(arrBytData)) { t = (T)xs.Deserialize(ms); } return t; } public static void WriteFile(T t, string fileName) { string strOutput = string.Empty; XmlSerializer xs = new XmlSerializer(typeof(T), "http://www.w3.org/2000/svg"); using (FileStream fs = new FileStream(fileName, FileMode.Create)) { xs.Serialize(new NonXsiTextWriter(fs,Encoding.UTF8), t); fs.Close(); } } public static T ReadFile(string fileName) { T t; XmlSerializer xs = new XmlSerializer(typeof(T), "http://www.w3.org/2000/svg"); using (FileStream fs = new FileStream(fileName, FileMode.Open)) { t = (T)xs.Deserialize(fs); } 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(); } } }