XmlSerializer.cs 5.54 KB
using System;
using System.Collections;
using System.IO;

namespace Quiz.Utility
{
	/// <summary>
	/// XML对象序列化。
	/// </summary>
	public class XmlSerializer
	{
		static Hashtable serializers;

		static XmlSerializer() { serializers = new Hashtable(); }
		static System.Xml.Serialization.XmlSerializer GetXmlSerializer(Type type)
		{
			System.Xml.Serialization.XmlSerializer ser = (System.Xml.Serialization.XmlSerializer)serializers[type];
			if (ser == null)
			{
				ser = new System.Xml.Serialization.XmlSerializer(type, new System.Xml.Serialization.XmlRootAttribute() { ElementName = "Body", Namespace = "" });
				serializers[type] = ser;
			}
			return ser;
		}

		/// <summary>
		/// 将对象序列化成xml字符串。
		/// </summary>
		/// <param name="o"></param>
		/// <returns></returns>
		public static string Serialize(object o)
		{
			if (o == null) return null;
			System.IO.MemoryStream ms = null;
			try
			{
				ms = new System.IO.MemoryStream();
				var xmlserializer = GetXmlSerializer(o.GetType());
				xmlserializer.Serialize(ms, o, new System.Xml.Serialization.XmlSerializerNamespaces(new System.Xml.XmlQualifiedName[] { new System.Xml.XmlQualifiedName("", "") }));
				string xml = System.Text.Encoding.UTF8.GetString(ms.GetBuffer());
				ms.Close(); ms.Dispose(); ms = null;
				return xml;
			}
			catch { return null; }
			finally { if (ms != null) { ms.Close(); ms.Dispose(); } }
		}
		/// <summary>
		/// 将xml文档反序列化成对象。
		/// </summary>
		/// <param name="type"></param>
		/// <param name="xml"></param>
		/// <returns></returns>
		public static object Deserialize(Type type, string xml)
		{
			if (type == null || string.IsNullOrEmpty(xml)) return null;
			System.IO.MemoryStream ms = null;
			try
			{
				var xmlserializer = GetXmlSerializer(type);
				ms = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml));
				object o = xmlserializer.Deserialize(ms);
				ms.Close(); ms.Dispose(); ms = null;
				return o;
			}
			catch { return null; }
			finally { if (ms != null) { ms.Close(); ms.Dispose(); } }
		}

        /// <summary>
        /// 将对象序列化成xml字符串。
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public static string SerializeGoole(object o)
        {
            if (o == null) return null;
            System.IO.MemoryStream ms = null;
            try
            {
                ms = new System.IO.MemoryStream();
                var xmlserializer = GetXmlSerializerGoole(o.GetType());
                xmlserializer.Serialize(ms, o, new System.Xml.Serialization.XmlSerializerNamespaces(new System.Xml.XmlQualifiedName[] { new System.Xml.XmlQualifiedName("", "") }));// (new System.Xml.XmlQualifiedName[] { new System.Xml.XmlQualifiedName("", "") }));
                string xml = System.Text.Encoding.UTF8.GetString(ms.GetBuffer());
                ms.Close(); ms.Dispose(); ms = null;
                return xml.Replace("\0", "");
            }
            catch { return null; }
            finally { if (ms != null) { ms.Close(); ms.Dispose(); } }
        }

        static System.Xml.Serialization.XmlSerializer GetXmlSerializerGoole(Type type)
        {
            System.Xml.Serialization.XmlSerializer ser = (System.Xml.Serialization.XmlSerializer)serializers[type];
            if (ser == null)
            {
                ser = new System.Xml.Serialization.XmlSerializer(type, new System.Xml.Serialization.XmlRootAttribute() { ElementName = "urlset", Namespace = "" });
                serializers[type] = ser;
            }
            return ser;
        }

        public static string Serializer<T>(object obj)
        {
            try
            {
                MemoryStream stream = new MemoryStream();
                System.Xml.Serialization.XmlSerializer xml = new System.Xml.Serialization.XmlSerializer(typeof(T));
                System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings();
                settings.Indent = true;
                settings.NewLineChars = "\r\n";
                settings.Encoding = System.Text.Encoding.UTF8;
                settings.IndentChars = "  ";
                //不生成声明头
                settings.OmitXmlDeclaration = true;
                //强制指定命名空间,覆盖默认的命名空间。
                System.Xml.Serialization.XmlSerializerNamespaces namespaces = new System.Xml.Serialization.XmlSerializerNamespaces();
                namespaces.Add(string.Empty, string.Empty);
                using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(stream, settings))
                {
                    //序列化对象
                    xml.Serialize(writer, obj, namespaces);
                    writer.Close();
                }
                stream.Position = 0;
                StreamReader sr = new StreamReader(stream);
                string str = sr.ReadToEnd();
                sr.Dispose();
                stream.Dispose();
                return str;
            }
            catch (Exception e)
            {
                return "";
            }
        }

        public static T Deserialize<T>(string xml)
        {
            try
            {
                using (StringReader sr = new StringReader(xml))
                {
                    System.Xml.Serialization.XmlSerializer xmldes = new System.Xml.Serialization.XmlSerializer(typeof(T));
                    return (T)xmldes.Deserialize(sr);
                }
            }
            catch (Exception e)
            {
                return default(T);
            }
        }
	}
}