SerializeHelper.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.IO;
  4. using System.IO.Compression;
  5. using System.Runtime.Serialization.Formatters.Binary;
  6. using System.Runtime.Serialization.Json;
  7. using System.Text;
  8. using System.Xml;
  9. using System.Xml.Serialization;
  10. namespace Venus_Unity
  11. {
  12. public class SerializeHelper
  13. {
  14. private static SerializeHelper m_Instance;
  15. public static SerializeHelper Instance
  16. {
  17. get
  18. {
  19. if (m_Instance == null)
  20. {
  21. m_Instance = new SerializeHelper();
  22. }
  23. return m_Instance;
  24. }
  25. }
  26. public SerializeHelper()
  27. { }
  28. #region XML序列化
  29. /// <summary>
  30. /// 文件化XML序列化
  31. /// </summary>
  32. /// <param name="obj">对象</param>
  33. /// <param name="filename">文件路径</param>
  34. public void Save(object obj, string filename)
  35. {
  36. FileStream fs = null;
  37. try
  38. {
  39. fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
  40. //Create our own namespaces for the output
  41. XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
  42. //Add an empty namespace and empty value
  43. ns.Add("", "");
  44. XmlSerializer serializer = new XmlSerializer(obj.GetType());
  45. serializer.Serialize(fs, obj, ns);
  46. }
  47. catch (Exception ex)
  48. {
  49. throw ex;
  50. }
  51. finally
  52. {
  53. if (fs != null) fs.Close();
  54. }
  55. }
  56. /// <summary>
  57. /// 文件化XML反序列化
  58. /// </summary>
  59. /// <param name="type">对象类型</param>
  60. /// <param name="filename">文件路径</param>
  61. public object Load(Type type, string filename)
  62. {
  63. FileStream fs = null;
  64. try
  65. {
  66. fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  67. XmlSerializer serializer = new XmlSerializer(type);
  68. return serializer.Deserialize(fs);
  69. }
  70. catch (Exception ex)
  71. {
  72. throw ex;
  73. }
  74. finally
  75. {
  76. if (fs != null) fs.Close();
  77. }
  78. }
  79. /// <summary>
  80. /// 文本化XML序列化
  81. /// </summary>
  82. /// <param name="item">对象</param>
  83. public string ToXml<T>(T item)
  84. {
  85. XmlSerializer serializer = new XmlSerializer(item.GetType());
  86. StringBuilder sb = new StringBuilder();
  87. using (XmlWriter writer = XmlWriter.Create(sb))
  88. {
  89. serializer.Serialize(writer, item);
  90. return sb.ToString();
  91. }
  92. }
  93. /// <summary>
  94. /// 文本化XML反序列化
  95. /// </summary>
  96. /// <param name="str">字符串序列</param>
  97. public T FromXml<T>(string str)
  98. {
  99. XmlSerializer serializer = new XmlSerializer(typeof(T));
  100. using (XmlReader reader = new XmlTextReader(new StringReader(str)))
  101. {
  102. return (T)serializer.Deserialize(reader);
  103. }
  104. }
  105. #endregion
  106. #region BinaryFormatter序列化
  107. /// <summary>
  108. /// BinaryFormatter序列化
  109. /// </summary>
  110. /// <param name="item">对象</param>
  111. public string ToBinary<T>(T item)
  112. {
  113. BinaryFormatter formatter = new BinaryFormatter();
  114. using (MemoryStream ms = new MemoryStream())
  115. {
  116. formatter.Serialize(ms, item);
  117. ms.Position = 0;
  118. byte[] bytes = ms.ToArray();
  119. StringBuilder sb = new StringBuilder();
  120. foreach (byte bt in bytes)
  121. {
  122. sb.Append(string.Format("{0:X2}", bt));
  123. }
  124. return sb.ToString();
  125. }
  126. }
  127. /// <summary>
  128. /// BinaryFormatter反序列化
  129. /// </summary>
  130. /// <param name="str">字符串序列</param>
  131. public T FromBinary<T>(string str)
  132. {
  133. int intLen = str.Length / 2;
  134. byte[] bytes = new byte[intLen];
  135. for (int i = 0; i < intLen; i++)
  136. {
  137. int ibyte = Convert.ToInt32(str.Substring(i * 2, 2), 16);
  138. bytes[i] = (byte)ibyte;
  139. }
  140. BinaryFormatter formatter = new BinaryFormatter();
  141. using (MemoryStream ms = new MemoryStream(bytes))
  142. {
  143. return (T)formatter.Deserialize(ms);
  144. }
  145. }
  146. #endregion
  147. /// <summary>
  148. /// 将对象序列化为二进制字节
  149. /// </summary>
  150. /// <param name="obj">待序列化的对象</param>
  151. /// <returns></returns>
  152. public byte[] SerializeToBinary(object obj)
  153. {
  154. byte[] bytes = new byte[2500];
  155. using (MemoryStream memoryStream = new MemoryStream())
  156. {
  157. BinaryFormatter bformatter = new BinaryFormatter();
  158. bformatter.Serialize(memoryStream, obj);
  159. memoryStream.Seek(0, 0);
  160. if (memoryStream.Length > bytes.Length)
  161. {
  162. bytes = new byte[memoryStream.Length];
  163. }
  164. bytes = memoryStream.ToArray();
  165. }
  166. return bytes;
  167. }
  168. /// <summary>
  169. /// 从二进制字节中反序列化为对象
  170. /// </summary>
  171. /// <param name="type">对象的类型</param>
  172. /// <param name="bytes">字节数组</param>
  173. /// <returns>反序列化后得到的对象</returns>
  174. public object DeserializeFromBinary(Type type, byte[] bytes)
  175. {
  176. object result = new object();
  177. using (MemoryStream memoryStream = new MemoryStream(bytes))
  178. {
  179. BinaryFormatter serializer = new BinaryFormatter();
  180. result = serializer.Deserialize(memoryStream);
  181. }
  182. return result;
  183. }
  184. /// <summary>
  185. /// 将文件对象序列化到文件中
  186. /// </summary>
  187. /// <param name="obj">待序列化的对象</param>
  188. /// <param name="path">文件路径</param>
  189. /// <param name="fileMode">文件打开模式</param>
  190. public void SerializeToBinary(object obj, string path, FileMode fileMode)
  191. {
  192. using (FileStream fs = new FileStream(path, fileMode))
  193. {
  194. // Construct a BinaryFormatter and use it to serialize the data to the stream.
  195. BinaryFormatter formatter = new BinaryFormatter();
  196. formatter.Serialize(fs, obj);
  197. }
  198. }
  199. /// <summary>
  200. /// 将文件对象序列化到文件中
  201. /// </summary>
  202. /// <param name="obj">待序列化的对象</param>
  203. /// <param name="path">文件路径</param>
  204. public void SerializeToBinary(object obj, string path)
  205. {
  206. SerializeToBinary(obj, path, FileMode.Create);
  207. }
  208. /// <summary>
  209. /// 从二进制文件中反序列化为对象
  210. /// </summary>
  211. /// <param name="type">对象的类型</param>
  212. /// <param name="path">二进制文件路径</param>
  213. /// <returns>反序列化后得到的对象</returns>
  214. public object DeserializeFromBinary(Type type, string path)
  215. {
  216. object result = new object();
  217. using (FileStream fileStream = new FileStream(path, FileMode.Open))
  218. {
  219. BinaryFormatter serializer = new BinaryFormatter();
  220. result = serializer.Deserialize(fileStream);
  221. }
  222. return result;
  223. }
  224. /// <summary>
  225. /// 获取对象的转换为二进制的字节大小
  226. /// </summary>
  227. /// <param name="obj"></param>
  228. /// <returns></returns>
  229. public long GetByteSize(object obj)
  230. {
  231. long result;
  232. BinaryFormatter bFormatter = new BinaryFormatter();
  233. using (MemoryStream stream = new MemoryStream())
  234. {
  235. bFormatter.Serialize(stream, obj);
  236. result = stream.Length;
  237. }
  238. return result;
  239. }
  240. /// <summary>
  241. /// 克隆一个对象
  242. /// </summary>
  243. /// <param name="obj">待克隆的对象</param>
  244. /// <returns>克隆的一个新的对象</returns>
  245. public object Clone(object obj)
  246. {
  247. object cloned = null;
  248. BinaryFormatter bFormatter = new BinaryFormatter();
  249. using (MemoryStream memoryStream = new MemoryStream())
  250. {
  251. try
  252. {
  253. bFormatter.Serialize(memoryStream, obj);
  254. memoryStream.Seek(0, SeekOrigin.Begin);
  255. cloned = bFormatter.Deserialize(memoryStream);
  256. }
  257. catch //(Exception e)
  258. {
  259. ;
  260. }
  261. }
  262. return cloned;
  263. }
  264. /// <summary>
  265. /// 从文件中读取文本内容
  266. /// </summary>
  267. /// <param name="path">文件路径</param>
  268. /// <returns>文件的内容</returns>
  269. public string ReadFile(string path)
  270. {
  271. string content = string.Empty;
  272. using (StreamReader reader = new StreamReader(path))
  273. {
  274. content = reader.ReadToEnd();
  275. }
  276. return content;
  277. }
  278. private byte[] compress(byte[] bytes)
  279. {
  280. using (MemoryStream ms = new MemoryStream())
  281. {
  282. using (DeflateStream gzs = new DeflateStream(ms, CompressionMode.Compress, false))
  283. {
  284. gzs.Write(bytes, 0, bytes.Length);
  285. }
  286. ms.Close();
  287. return ms.GetBuffer();
  288. }
  289. }
  290. private byte[] decompress(byte[] bytes)
  291. {
  292. using (MemoryStream ms = new MemoryStream(bytes, false))
  293. {
  294. using (DeflateStream gzs = new DeflateStream(ms, CompressionMode.Decompress, false))
  295. {
  296. using (MemoryStream dest = new MemoryStream())
  297. {
  298. byte[] tmp = new byte[bytes.Length];
  299. int read;
  300. while ((read = gzs.Read(tmp, 0, tmp.Length)) != 0)
  301. {
  302. dest.Write(tmp, 0, read);
  303. }
  304. dest.Close();
  305. return dest.GetBuffer();
  306. }
  307. }
  308. }
  309. }
  310. /// <summary>
  311. /// 序列化成一个字符串
  312. /// </summary>
  313. /// <typeparam name="T"></typeparam>
  314. /// <param name="entity"></param>
  315. /// <returns></returns>
  316. public string XMLSerializeToString<T>(T entity)
  317. {
  318. StringBuilder buffer = new StringBuilder();
  319. XmlSerializer serializer = new XmlSerializer(typeof(T));
  320. using (TextWriter writer = new StringWriter(buffer))
  321. {
  322. serializer.Serialize(writer, entity);
  323. }
  324. return buffer.ToString();
  325. }
  326. /// <summary>
  327. /// xml字符串反序列化为一个XML文件
  328. /// </summary>
  329. /// <typeparam name="T"></typeparam>
  330. /// <param name="xmlString"></param>
  331. /// <returns></returns>
  332. public T DeXMLSerialize<T>(string xmlString)
  333. {
  334. T cloneObject = default(T);
  335. StringBuilder buffer = new StringBuilder();
  336. buffer.Append(xmlString);
  337. XmlSerializer serializer = new XmlSerializer(typeof(T));
  338. using (TextReader reader = new StringReader(buffer.ToString()))
  339. {
  340. Object obj = serializer.Deserialize(reader);
  341. cloneObject = (T)obj;
  342. }
  343. return cloneObject;
  344. }
  345. /// <summary>
  346. /// Json转换成对象
  347. /// </summary>
  348. /// <typeparam name="T"></typeparam>
  349. /// <param name="jsonText"></param>
  350. /// <returns></returns>
  351. public T JsonStringToObject<T>(string jsonText)
  352. {
  353. DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(T));
  354. MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));
  355. T obj = (T)s.ReadObject(ms);
  356. ms.Dispose();
  357. return obj;
  358. }
  359. /// <summary>
  360. /// 对象转换成JSON
  361. /// </summary>
  362. /// <typeparam name="T"></typeparam>
  363. /// <param name="obj"></param>
  364. /// <returns></returns>
  365. public string ObjectToJsonString<T>(T obj)
  366. {
  367. string result = string.Empty;
  368. try
  369. {
  370. DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
  371. using (MemoryStream ms = new MemoryStream())
  372. {
  373. serializer.WriteObject(ms, obj);
  374. ms.Position = 0;
  375. using (StreamReader read = new StreamReader(ms))
  376. {
  377. result = read.ReadToEnd();
  378. }
  379. }
  380. }
  381. catch (Exception ex)
  382. {
  383. throw new Exception(" 对象转换成JSON失败!" + ex.Message);
  384. }
  385. return result;
  386. }
  387. /// <summary>
  388. /// 类对象保存为Json文件
  389. /// </summary>
  390. /// <typeparam name="T"></typeparam>
  391. /// <param name="obj"></param>
  392. /// <param name="strFilePath"></param>
  393. /// <returns></returns>
  394. public bool WriteToJsonFile<T>(T obj, string strFilePath)
  395. {
  396. bool bRes = false;
  397. try
  398. {
  399. string strJson = ObjectToJsonString(obj);
  400. //File.WriteAllText(strFilePath, strJson, Encoding.UTF8);
  401. WriteToJsonFile(strJson, strFilePath);
  402. bRes = true;
  403. }
  404. catch (Exception ex)
  405. {
  406. throw new Exception("Write Json File Fail!" + ex.Message);
  407. }
  408. return bRes;
  409. }
  410. /// <summary>
  411. /// Json文件转换为类对象
  412. /// </summary>
  413. /// <typeparam name="T"></typeparam>
  414. /// <param name="strFilePath"></param>
  415. /// <returns></returns>
  416. public T ReadFromJsonFile<T>(string strFilePath)
  417. {
  418. if (File.Exists(strFilePath))
  419. {
  420. try
  421. {
  422. string strJson = File.ReadAllText(strFilePath);
  423. return JsonStringToObject<T>(strJson);
  424. }
  425. catch (Exception ex)
  426. {
  427. throw new Exception("Read Json File Fail!" + ex.Message);
  428. }
  429. }
  430. else
  431. {
  432. throw new Exception("File is not Exit!");
  433. }
  434. }
  435. /// <summary>
  436. /// 对象转换成JSON,并保存文件
  437. /// </summary>
  438. /// <param name="obj"></param>
  439. /// <param name="path"></param>
  440. public void WriteToJsonFile(string content, string path)
  441. {
  442. if (!File.Exists(path)) // 判断是否已有相同文件
  443. {
  444. FileStream fs1 = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);
  445. fs1.Flush();
  446. fs1.Dispose();
  447. fs1.Close();
  448. }
  449. File.WriteAllText(path, ConvertJsonString(content));
  450. }
  451. /// <summary>
  452. /// 格式化json字符串
  453. /// </summary>
  454. /// <param name="str"></param>
  455. /// <returns></returns>
  456. private string ConvertJsonString(string str)
  457. {
  458. JsonSerializer serializer = new JsonSerializer();
  459. TextReader tr = new StringReader(str);
  460. JsonTextReader jtr = new JsonTextReader(tr);
  461. object obj = serializer.Deserialize(jtr);
  462. if (obj != null)
  463. {
  464. StringWriter textWriter = new StringWriter();
  465. JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
  466. {
  467. Formatting = Newtonsoft.Json.Formatting.Indented,
  468. Indentation = 4,
  469. IndentChar = ' '
  470. };
  471. serializer.Serialize(jsonWriter, obj);
  472. return textWriter.ToString();
  473. }
  474. else
  475. {
  476. return str;
  477. }
  478. }
  479. public static T DeepCopyJson<T>(T obj)
  480. {
  481. return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(obj));
  482. }
  483. }
  484. }