2010-03-25 19:38:51 +00:00

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