通过XmlSerializer 实现XML的序列化与反序列化

通过XmlSerializer 我们可以十分简单的将Model与XML进行转换

官文在点这里

帮助类

  1 using System;

  2 using System.Text;

  3 using System.Xml.Serialization;

  4 using System.IO;

  5 using System.Xml;

  6 

  7 namespace BLL

  8 {

  9     public class XmlHelper

 10     {

 11         public static T DeSerializeModels<T>(string XMLStr, string eleName)

 12         {

 13             XmlRootAttribute Root = new XmlRootAttribute();

 14             Root.ElementName = eleName;

 15 

 16             XmlSerializer xs = new XmlSerializer(typeof(T), Root);

 17 

 18             StringReader strReader = new StringReader(XMLStr);

 19             System.Xml.XmlReader r = new System.Xml.XmlTextReader(strReader);

 20             try

 21             {

 22                 T Result = (T)xs.Deserialize(r);

 23                 return Result;

 24             }

 25             finally

 26             {

 27                 strReader.Close();

 28                 r.Close();

 29             }

 30         }

 31 

 32         public static string SerializeModels<T>(T Models,string eleName)

 33         {

 34             StringBuilder sb = new StringBuilder();

 35             StringWriter w = new StringWriter(sb);

 36 

 37             XmlRootAttribute Root = new XmlRootAttribute();

 38             Root.ElementName = eleName;

 39 

 40             XmlSerializer sr = new XmlSerializer(typeof(T), Root);

 41             sr.Serialize(w, Models);

 42 

 43             w.Close();

 44 

 45             return sb.ToString();

 46         }

 47 

 48         private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding)

 49         {

 50             if (o == null)

 51                 throw new ArgumentNullException("o");

 52             if (encoding == null)

 53                 throw new ArgumentNullException("encoding");

 54 

 55             XmlSerializer serializer = new XmlSerializer(o.GetType());

 56 

 57             XmlWriterSettings settings = new XmlWriterSettings();

 58             settings.Indent = true;

 59             settings.NewLineChars = "\r\n";

 60             settings.Encoding = encoding;

 61             settings.IndentChars = "    ";

 62 

 63             using (XmlWriter writer = XmlWriter.Create(stream, settings))

 64             {

 65                 serializer.Serialize(writer, o);

 66                 writer.Close();

 67             }

 68         }

 69 

 70         /// <summary>

 71         /// 将一个对象序列化为XML字符串

 72         /// </summary>

 73         /// <param name="o">要序列化的对象</param>

 74         /// <param name="encoding">编码方式</param>

 75         /// <returns>序列化产生的XML字符串</returns>

 76         public static string XmlSerialize(object o, Encoding encoding)

 77         {

 78             using (MemoryStream stream = new MemoryStream())

 79             {

 80                 XmlSerializeInternal(stream, o, encoding);

 81 

 82                 stream.Position = 0;

 83                 using (StreamReader reader = new StreamReader(stream, encoding))

 84                 {

 85                     return reader.ReadToEnd();

 86                 }

 87             }

 88         }

 89 

 90         /// <summary>

 91         /// 将一个对象序列化为XML字符串

 92         /// </summary>

 93         /// <param name="o">要序列化的对象</param>

 94         /// <returns>序列化产生的XML字符串</returns>

 95         public static string XmlSerialize(object o)

 96         {

 97             return XmlSerialize(o, Encoding.UTF8);

 98         }

 99 

100         /// <summary>

101         /// 将一个对象按XML序列化的方式写入到一个文件

102         /// </summary>

103         /// <param name="o">要序列化的对象</param>

104         /// <param name="UploadPath">保存文件路径</param>

105         /// <param name="encoding">编码方式</param>

106         public static void XmlSerializeToFile(object o, string path, Encoding encoding)

107         {

108             if (string.IsNullOrEmpty(path))

109                 throw new ArgumentNullException("path");

110 

111             using (FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write))

112             {

113                 XmlSerializeInternal(file, o, encoding);

114             }

115         }

116 

117         /// <summary>

118         /// 将一个对象按XML序列化的方式写入到一个文件

119         /// </summary>

120         /// <param name="o">要序列化的对象</param>

121         /// <param name="UploadPath">保存文件路径</param>

122         public static void XmlSerializeToFile(object o, string path)

123         {

124             XmlSerializeToFile(o, path, Encoding.UTF8);

125         }

126 

127         /// <summary>

128         /// 从XML字符串中反序列化对象

129         /// </summary>

130         /// <typeparam name="T">结果对象类型</typeparam>

131         /// <param name="s">包含对象的XML字符串</param>

132         /// <param name="encoding">编码方式</param>

133         /// <returns>反序列化得到的对象</returns>

134         public static T XmlDeserialize<T>(string s, Encoding encoding)

135         {

136             if (string.IsNullOrEmpty(s))

137                 throw new ArgumentNullException("s");

138             if (encoding == null)

139                 throw new ArgumentNullException("encoding");

140 

141             XmlSerializer xs = new XmlSerializer(typeof(T));

142             using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))

143             {

144                 using (StreamReader sr = new StreamReader(ms, encoding))

145                 {

146                     return (T)xs.Deserialize(sr);

147                 }

148             }

149         }

150 

151         /// <summary>

152         /// 从XML字符串中反序列化对象

153         /// </summary>

154         /// <typeparam name="T">结果对象类型</typeparam>

155         /// <param name="s">包含对象的XML字符串</param>

156         /// <returns>反序列化得到的对象</returns>

157         public static T XmlDeserialize<T>(string s)

158         {

159             return XmlDeserialize<T>(s, Encoding.UTF8);

160         }

161 

162         /// <summary>

163         /// 读入一个文件,并按XML的方式反序列化对象。

164         /// </summary>

165         /// <typeparam name="T">结果对象类型</typeparam>

166         /// <param name="UploadPath">文件路径</param>

167         /// <param name="encoding">编码方式</param>

168         /// <returns>反序列化得到的对象</returns>

169         public static T XmlDeserializeFromFile<T>(string path, Encoding encoding)

170         {

171             if (string.IsNullOrEmpty(path))

172                 throw new ArgumentNullException("path");

173             if (encoding == null)

174                 throw new ArgumentNullException("encoding");

175 

176             string xml = File.ReadAllText(path, encoding);

177             return XmlDeserialize<T>(xml, encoding);

178         }

179 

180         /// <summary>

181         /// 读入一个文件,并按XML的方式反序列化对象。

182         /// </summary>

183         /// <typeparam name="T">结果对象类型</typeparam>

184         /// <param name="UploadPath">文件路径</param>

185         /// <returns>反序列化得到的对象</returns>

186         public static T XmlDeserializeFromFile<T>(string path)

187         {

188             return XmlDeserializeFromFile<T>(path, Encoding.UTF8);

189         }

190     }

191 }
工具类

 

同时也可以通过设置Model的特性,灵活的控制序列化

using System.Xml.Serialization;

using System;

using System.Collections.Generic;



namespace Model

{

    /// <summary>

    /// 节点名是EleTeacher

    /// </summary>

    [Serializable]

    [XmlType("EleTeacher")]

    public class Teacher

    {

        [XmlElement(ElementName = "user")]

        public string AuthorID { set; get; }



        [XmlIgnore]

        public string Content { set; get; }



        [XmlText]

        public string Value { set; get; }



        [XmlArray("students")]

        public List<Student> sds { set; get; }

    }



    [Serializable]

    public class Student

    {

        [XmlAttribute(AttributeName = "id")]

        public string ID { set; get; }



        [XmlText]

        public string Name { set; get; }

    }

}
Model

 

 

你可能感兴趣的:(Serialize)