97 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
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<T> 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(); 
 | 
						|
		} 
 | 
						|
	}
 | 
						|
}
 |