Xmlserialization

来源:互联网 发布:手机有mac地址吗 编辑:程序博客网 时间:2024/06/16 19:01
  public class XmlSerializer
    {
        private static Dictionary<Type, System.Xml.Serialization.XmlSerializer> _dict = new Dictionary<Type, System.Xml.Serialization.XmlSerializer>();
        private static XmlSerializerNamespaces _namespaces;
        private static XmlSerializerNamespaces Namespaces
        {
            get
            {
                if (_namespaces == null)
                {
                    _namespaces = new XmlSerializerNamespaces();
                    _namespaces.Add("", "");
                }
                return _namespaces;
            }
        }
        public static T Clone<T>(T obj)
        {
            string xml = Serialize(obj);
            return Deserialize<T>(xml);
        }
        public static string Serialize(object obj)
        {
            if (obj == null)
            {
                return null;
            }
            using (StringWriter w = new StringWriter())
            {
                Serialize(w, obj);
                w.Flush();
                string result = w.ToString();
                w.Close();
                return result;
            }
        }
        public static void Serialize(Stream stream, object obj)
        {
            if (obj == null)
            {
                return;
            }
            StreamWriter w = new StreamWriter(stream);
            Serialize(w, obj);
            w.Flush();
            stream.Flush();
        }
        public static void Serialize(TextWriter writer, object obj)
        {
            if (obj == null)
            {
                return;
            }
            if (obj is IList)
            {
                using (XmlWriter w = XmlWriter.Create(writer, new XmlWriterSettings() { OmitXmlDeclaration = true }))
                {
                    w.WriteStartDocument();
                    w.WriteStartElement("XmlObjectList");
                    foreach (object element in (IList)obj)
                    {
                        w.WriteStartElement("Items");
                        w.WriteString(Serialize(element));
                        w.WriteEndElement();
                    }
                    w.WriteEndElement();
                    w.WriteEndDocument();
                    w.Flush();
                }
                writer.Flush();
                return;
            }
            Type type = obj.GetType();
            if (type.IsArray)
            {
                using (XmlWriter w = XmlWriter.Create(writer, new XmlWriterSettings() { OmitXmlDeclaration = true }))
                {
                    w.WriteStartDocument();
                    w.WriteStartElement("XmlObjectList");
                    foreach (object element in (Array)obj)
                    {
                        w.WriteStartElement("Items");
                        w.WriteString(Serialize(element));
                        w.WriteEndElement();
                    }
                    w.WriteEndElement();
                    w.WriteEndDocument();
                    w.Flush();
                }
                writer.Flush();
                return;
            }
            if (Util.IsSimpleType(type))
            {
                writer.Write(obj);
                writer.Flush();
                return;
            }
            System.Xml.Serialization.XmlSerializer xs = GetXmlSerializer(type);
            using (XmlWriter w = XmlWriter.Create(writer, new XmlWriterSettings() { OmitXmlDeclaration = true, Encoding = Encoding.UTF8 }))
            {
                lock (xs)
                {
                    xs.Serialize(w, obj, Namespaces);
                }
                w.Flush();
            }
            writer.Flush();
            return;
        }
        public static object Deserialize(TextReader reader, Type type)
        {
            if (reader == null)
            {
                return null;
            }
            if (type.IsArray)
            {
                Type elementType = type.GetElementType();
                IList list = DeserializeList(XmlReader.Create(reader), elementType);
                Array array = Array.CreateInstance(elementType, list.Count);
                for (int i = 0; i < list.Count; i++)
                {
                    array.SetValue(list[i], i);
                }
                return array;
            }
            if (Util.IsSimpleType(type))
            {
                return Util.ParseSimpleType(reader.ReadToEnd(), type);
            }
            System.Xml.Serialization.XmlSerializer xs = GetXmlSerializer(type);
            object result;
            lock (xs)
            {
                result = xs.Deserialize(reader);
            }
            return result;
        }
        public static T Deserialize<T>(TextReader reader)
        {
            return (T)Deserialize(reader, typeof(T));
        }
        public static T Deserialize<T>(string xml)
        {
            if (xml == null)
            {
                return default(T);
            }
            T result;
            using (StringReader r = new StringReader(xml))
            {
                result = Deserialize<T>(r);
                r.Close();
            }
            return result;
        }
        public static T Deserialize<T>(Stream stream)
        {
            if (stream == null)
            {
                return default(T);
            }
            T result;
            using (StreamReader r = new StreamReader(stream, Encoding.UTF8))
            {
                result = Deserialize<T>(r);
                r.Close();
            }
            return result;
        }
        public static List<T> DeserializeList<T>(string xml)
        {
            if (xml == null)
            {
                return null;
            }
            using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
            {
                List<T> list = DeserializeList<T>(reader);
                reader.Close();
                return list;
            }
        }
        public static List<T> DeserializeList<T>(Stream stream)
        {
            if (stream == null)
            {
                return null;
            }
            using (XmlReader reader = XmlReader.Create(stream))
            {
                List<T> list = DeserializeList<T>(reader);
                reader.Close();
                return list;
            }
        }
        public static IList DeserializeList(XmlReader reader, Type type)
        {
            if (reader == null)
            {
                return null;
            }
            IList list = new ArrayList();
            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Text)
                {
                    using (StringReader r = new StringReader(reader.ReadContentAsString()))
                    {
                        object element = XmlSerializer.Deserialize(r, type);
                        r.Close();
                        list.Add(element);
                    }
                }
            }
            return list;
        }
        public static List<T> DeserializeList<T>(XmlReader reader)
        {
            IList list = DeserializeList(reader, typeof(T));
            List<T> result = new List<T>();
            foreach (T element in list)
            {
                result.Add((T)element);
            }
            return result;
        }
        private static System.Xml.Serialization.XmlSerializer GetXmlSerializer(Type type)
        {
            System.Xml.Serialization.XmlSerializer xs;
            lock (_dict)
            {
                if (_dict.ContainsKey(type))
                {
                    xs = _dict[type];
                }
                else
                {
                    xs = new System.Xml.Serialization.XmlSerializer(type);
                    _dict.Add(type, xs);
                }
            }
            return xs;
        }
        private static bool IsXmlType(Type type)
        {
            object[] attributes = type.GetCustomAttributes(true);
            foreach (object attribute in attributes)
            {
                if (attribute is System.Xml.Serialization.XmlRootAttribute)
                {
                    return true;
                }
            }
            return false;
        }
    }
原创粉丝点击