C#序列化與反序列化對象XML和JSON 詳細代碼工具

  1. using System.IO;
  2. using System.Text;
  3. using System.Xml.Serialization;
  4. using System.Xml;
  5. using System.Runtime.Serialization.Json;
  6. using System;
  7. namespace cn.ava.PublicsUtil.Util
  8. {
  9. /// <summary>
  10. /// 創建人Rex.liu
  11. /// 創建時間:2015年9月6日 14:48:29
  12. /// 功能:序列化反序列化XML文件
  13. /// </summary>
  14. public class JsonAndXmlSerialization
  15. {
  16. #region 外部調用
  17. /// <summary>
  18. /// 將對象根據格式(XML/JSON)序列化成字符串結果
  19. /// </summary>
  20. /// <param name="o">目標對象</param>
  21. /// <param name="format">輸出格式</param>
  22. /// <returns></returns>
  23. public static string Serialize(object o, string format)
  24. {
  25. if (format.ToLower() == "xml")
  26. {
  27. return JsonAndXmlSerialization.XmlSerialize(o);
  28. }
  29. else
  30. {
  31. return JsonAndXmlSerialization.JsonSerialize(o);
  32. }
  33. }
  34. /// <summary>
  35. /// 將字符串根據格式(XML/JSON)反序列化成指定類型的對象
  36. /// </summary>
  37. /// <typeparam name="T">指定類型</typeparam>
  38. /// <param name="s">目標字符串</param>
  39. /// <param name="format">輸入格式</param>
  40. /// <returns></returns>
  41. public static T Deserialize<T>(string s, string format)
  42. {
  43. if (format.ToLower() == "xml")
  44. {
  45. return JsonAndXmlSerialization.XmlDeserialize<T>(s);
  46. }
  47. else
  48. {
  49. return JsonAndXmlSerialization.JsonDeserialize<T>(s);
  50. }
  51. }
  52. /// <summary>
  53. /// 對象序列化成文件並保存
  54. /// </summary>
  55. /// <typeparam name="T">對象類型</typeparam>
  56. /// <param name="t">對象實體</param>
  57. /// <param name="path">文件路徑</param>
  58. /// <param name="format">格式:json或 xml</param>
  59. /// <returns></returns>
  60. public static bool SerializableFile<T>(object t, string path, string format)
  61. {
  62. if (format.ToLower() == "xml")
  63. {
  64. return JsonAndXmlSerialization.SerializableXML<T>(t, path);
  65. }
  66. else
  67. {
  68. return JsonAndXmlSerialization.SerializableJson<T>(t, path);
  69. }
  70. }
  71. /// <summary>
  72. /// 將文件反序列化成對象
  73. /// </summary>
  74. /// <typeparam name="T">對象類型</typeparam>
  75. /// <param name="path">文件路徑</param>
  76. /// <param name="format">格式: json 或 xml</param>
  77. /// <returns></returns>
  78. public static T DeserializeFile<T>(string path, string format)
  79. {
  80. if (format.ToLower() == "xml")
  81. {
  82. return JsonAndXmlSerialization.DeSerializableXML<T>(path);
  83. }
  84. else
  85. {
  86. return JsonAndXmlSerialization.DeSerializableJson<T>(path);
  87. }
  88. }
  89. #endregion
  90. #region 對象的序列化與反序列化
  91. /// <summary>
  92. /// 將object對象序列化成XML
  93. /// </summary>
  94. /// <param name="o"></param>
  95. /// <returns></returns>
  96. private static string XmlSerialize(object o)
  97. {
  98. XmlSerializer ser = new XmlSerializer(o.GetType());
  99. System.IO.MemoryStream mem = new MemoryStream();
  100. XmlTextWriter writer = new XmlTextWriter(mem, Encoding.UTF8);
  101. XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
  102. ns.Add("", "");
  103. ser.Serialize(writer, o, ns);
  104. writer.Close();
  105. return Encoding.UTF8.GetString(mem.ToArray());
  106. }
  107. /// <summary>
  108. /// 字符串反序列化成對象
  109. /// </summary>
  110. /// <typeparam name="T">對象類型</typeparam>
  111. /// <param name="s">XML值</param>
  112. /// <returns></returns>
  113. private static T XmlDeserialize<T>(string s)
  114. {
  115. XmlDocument xdoc = new XmlDocument();
  116. try
  117. {
  118. xdoc.LoadXml(s);
  119. XmlNodeReader reader = new XmlNodeReader(xdoc.DocumentElement);
  120. XmlSerializer ser = new XmlSerializer(typeof(T));
  121. object obj = ser.Deserialize(reader);
  122. return (T)obj;
  123. }
  124. catch
  125. {
  126. return default(T);
  127. }
  128. }
  129. /// <summary>
  130. /// 對象序列化成Json字符串
  131. /// </summary>
  132. /// <param name="o"></param>
  133. /// <returns></returns>
  134. private static string JsonSerialize(object o)
  135. {
  136. using (var ms = new MemoryStream())
  137. {
  138. new DataContractJsonSerializer(o.GetType()).WriteObject(ms, o);
  139. return Encoding.UTF8.GetString(ms.ToArray());
  140. }
  141. }
  142. /// <summary>
  143. /// Json字符串反序列化成對象
  144. /// </summary>
  145. /// <typeparam name="T"></typeparam>
  146. /// <param name="s"></param>
  147. /// <returns></returns>
  148. private static T JsonDeserialize<T>(string s)
  149. {
  150. using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(s)))
  151. {
  152. return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);
  153. }
  154. }
  155. #endregion
  156. #region 將對象保存成文件
  157. /// <summary>
  158. /// 將對象保存爲json文件
  159. /// </summary>
  160. /// <typeparam name="T">對象類型</typeparam>
  161. /// <param name="t">對象</param>
  162. /// <param name="path">保存路徑</param>
  163. /// <returns></returns>
  164. private static bool SerializableJson<T>(object t, string path)
  165. {
  166. bool bl = false;
  167. try
  168. {
  169. string strjson = JsonSerialize(t);
  170. System.IO.StreamWriter sw = System.IO.File.CreateText(path);
  171. sw.WriteLine(strjson);
  172. sw.Close();
  173. }
  174. catch
  175. {
  176. return bl;
  177. }
  178. return true;
  179. }
  180. /// <summary>
  181. /// 將對象序列化成XML並保存到文件
  182. /// </summary>
  183. /// <returns></returns>
  184. private static bool SerializableXML<T>(object t, string path)
  185. {
  186. bool bl = false;
  187. FileStream fileStream = null;
  188. try
  189. {
  190. if (t != null)
  191. {
  192. //創建xml格式器
  193. XmlSerializer xmls = new XmlSerializer(typeof(T));
  194. //創建文件流
  195. fileStream = new FileStream(path, FileMode.Create);
  196. //將對象序列化到流
  197. xmls.Serialize(fileStream, t);
  198. bl = true;
  199. }
  200. }
  201. catch (Exception ex)
  202. {
  203. throw ex;
  204. }
  205. finally
  206. {
  207. if (fileStream != null)
  208. {
  209. fileStream.Close();
  210. }
  211. }
  212. return bl;
  213. }
  214. #endregion
  215. #region 將文件反序列化成對象
  216. /// <summary>
  217. /// 將文件反序列化json
  218. /// </summary>
  219. /// <typeparam name="T">類型</typeparam>
  220. /// <param name="path">json所存放的路徑</param>
  221. /// <returns>實體</returns>
  222. private static T DeSerializableJson<T>(string path)
  223. {
  224. T t = default(T);
  225. try
  226. {
  227. FileInfo fi = new FileInfo(path);
  228. if (fi.Exists)
  229. {
  230. StreamReader sr = new StreamReader(path, Encoding.UTF8);
  231. String line;
  232. StringBuilder strcontent = new StringBuilder();
  233. while ((line = sr.ReadLine()) != null)
  234. {
  235. strcontent.Append(line.ToString());
  236. }
  237. t = JsonAndXmlSerialization.JsonDeserialize<T>(strcontent.ToString());
  238. }
  239. }
  240. catch (Exception ex)
  241. {
  242. throw ex;
  243. }
  244. return t;
  245. }
  246. /// <summary>
  247. /// 將文件反序列化XML
  248. /// </summary>
  249. /// <typeparam name="T">類型</typeparam>
  250. /// <param name="path">XMl所存放的路徑</param>
  251. /// <returns>實體</returns>
  252. private static T DeSerializableXML<T>(string path)
  253. {
  254. T t = default(T);
  255. FileStream fileStream = null;
  256. try
  257. {
  258. XmlSerializer xmls = new XmlSerializer(typeof(T));
  259. FileInfo fi = new FileInfo(path);
  260. if (fi.Exists)
  261. {
  262. fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
  263. t = (T)xmls.Deserialize(fileStream);
  264. }
  265. }
  266. catch (Exception ex)
  267. {
  268. throw ex;
  269. }
  270. finally
  271. {
  272. if (fileStream != null)
  273. {
  274. fileStream.Close();
  275. }
  276. }
  277. return t;
  278. }
  279. #endregion
  280. }
  281. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章