通过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
通过XmlSerializer 实现XML的序列化与反序列化
时间: 2024-10-12 05:32:57