100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.IO;
 | |
| using System.Xml;
 | |
| using System.Xml.Schema;
 | |
| using System.Xml.Serialization;
 | |
| 
 | |
| namespace SyncMany
 | |
| {
 | |
| 	public static class ObjectSerializer<T> 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.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));
 | |
| 			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));
 | |
| 			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));
 | |
| 			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();
 | |
| 		}
 | |
| 	}
 | |
| }
 |