ObjectSerializer.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Xml;
  6. using System.Xml.Serialization;
  7. using System.Runtime.Serialization;
  8. using System.Runtime.Serialization.Formatters;
  9. using System.Runtime.Serialization.Formatters.Binary;
  10. using System.IO;
  11. using System.Reflection;
  12. using Aitex.Core.RT.Log;
  13. namespace Aitex.Core.Util
  14. {
  15. public sealed class ObjectSerializer
  16. {
  17. private ObjectSerializer() { }
  18. /// <summary>
  19. /// Serialize the supplied object To memory stream in xml format.
  20. /// </summary>
  21. /// <param name="valueToSerializeToMemoryStream"></param>
  22. /// <returns></returns>
  23. public static MemoryStream SerializeObjectToMemoryStream(object valueToSerializeToMemoryStream)
  24. {
  25. var retVal = new MemoryStream();
  26. var typeToSerialize = valueToSerializeToMemoryStream.GetType();
  27. var serializer = new XmlSerializer(typeToSerialize);
  28. serializer.Serialize(retVal, valueToSerializeToMemoryStream);
  29. retVal.Seek(0, SeekOrigin.Begin);
  30. return retVal;
  31. }
  32. /// <summary>
  33. ///
  34. /// </summary>
  35. /// <param name="obj"></param>
  36. /// <returns></returns>
  37. public static XmlDocument SerializeObjectToXmlDom(object obj)
  38. {
  39. Stream stream = SerializeObjectToMemoryStream(obj);
  40. XmlDocument xmldom = new XmlDocument();
  41. xmldom.Load(stream);
  42. return xmldom;
  43. }
  44. private static Type[] RemoveDuplicateType(Type typeOfObject, IEnumerable<Type> types)
  45. {
  46. var typeList = new List<Type>();
  47. foreach (var type in types)
  48. {
  49. if (!type.FullName.Equals(typeOfObject.FullName))
  50. {
  51. typeList.Add(type);
  52. }
  53. }
  54. return typeList.ToArray();
  55. }
  56. /// <summary>
  57. /// Serialize derived types to xml stream, SeekOrigin set to Begin.
  58. /// </summary>
  59. /// <param name="valueToSerializeToMemoryStream"></param>
  60. /// <param name="types"></param>
  61. /// <returns></returns>
  62. public static MemoryStream SerializeObjectToMemoryStream(object valueToSerializeToMemoryStream, Type[] types)
  63. {
  64. var retVal = new MemoryStream();
  65. var typeToSerialize = valueToSerializeToMemoryStream.GetType();
  66. types = RemoveDuplicateType(typeToSerialize, types);
  67. var serializer = new XmlSerializer(typeToSerialize, types);
  68. serializer.Serialize(retVal, valueToSerializeToMemoryStream);
  69. retVal.Seek(0, SeekOrigin.Begin);
  70. return retVal;
  71. }
  72. /// <summary>
  73. /// Serialize the supplied object To binary stream, SeekOrigin set to Begin.
  74. /// </summary>
  75. /// <param name="valueToSerializeToMemoryStream"></param>
  76. /// <returns></returns>
  77. public static MemoryStream SerializeObjectToBinaryStream(object valueToSerializeToMemoryStream)
  78. {
  79. // Converts object [objectToSerialize] of type [typeOfObjectBeingSerialized] to a memory stream
  80. var retVal = new MemoryStream();
  81. IFormatter formatter = new BinaryFormatter();
  82. formatter.Serialize(retVal, valueToSerializeToMemoryStream);
  83. retVal.Seek(0, SeekOrigin.Begin);
  84. return retVal;
  85. }
  86. /// <summary>
  87. /// Serializes an object into a file using binary formatter.
  88. /// </summary>
  89. /// <param name="fullFileName"></param>
  90. /// <param name="valueToSerialize"></param>
  91. /// <returns></returns>
  92. public static bool SerializeObjectToBinaryFile(string fullFileName, object valueToSerialize)
  93. {
  94. try
  95. {
  96. using (FileStream stream = new FileStream(fullFileName, FileMode.OpenOrCreate))
  97. {
  98. IFormatter formatter = new BinaryFormatter();
  99. formatter.Serialize(stream, valueToSerialize);
  100. stream.Seek(0, SeekOrigin.Begin);
  101. }
  102. }
  103. catch (Exception e)
  104. {
  105. LOG.Error(e.Message);
  106. return false;
  107. }
  108. return true;
  109. }
  110. /// <summary>
  111. /// Serialize the supplied object To Xml stream
  112. /// </summary>
  113. /// <param name="valueToSerializeToMemoryStream"></param>
  114. /// <returns></returns>
  115. public static string SerializeObjectToXml(object valueToSerializeToMemoryStream)
  116. {
  117. using (var memStream = SerializeObjectToMemoryStream(valueToSerializeToMemoryStream))
  118. using (var reader = new StreamReader(memStream))
  119. {
  120. return reader.ReadToEnd();
  121. }
  122. }
  123. /// <summary>
  124. /// Serializes an object into a Xml file.
  125. /// </summary>
  126. /// <param name="fullFileName"></param>
  127. /// <param name="valueToSerializeToFile"></param>
  128. /// <returns></returns>
  129. public static bool SerializeObjectToXmlFile(string fullFileName, object valueToSerializeToFile)
  130. {
  131. try
  132. {
  133. using (FileStream fs = new FileStream(fullFileName, FileMode.Create))//file existed, use "FileMode.CreateNew" will cause exception
  134. {
  135. using (MemoryStream ms = SerializeObjectToMemoryStream(valueToSerializeToFile))
  136. {
  137. ms.WriteTo(fs);
  138. ms.Close();
  139. }
  140. fs.Close();
  141. }
  142. }
  143. catch (Exception e)
  144. {
  145. LOG.Error(e.Message);
  146. return false;
  147. }
  148. return true;
  149. }
  150. /// <summary>
  151. /// Deserialize supplied stream using XmlSerializer
  152. /// </summary>
  153. /// <typeparam name="T"></typeparam>
  154. /// <param name="stream"></param>
  155. /// <returns></returns>
  156. public static T DeserializeObjectFromStream<T>(Stream stream)
  157. {
  158. //todo here always throw exception sometimes
  159. var serializer = new XmlSerializer(typeof(T));
  160. var retVal = (T)serializer.Deserialize(stream);
  161. return retVal;
  162. }
  163. /// <summary>
  164. /// Convert binary file content to object
  165. /// </summary>
  166. /// <typeparam name="T"></typeparam>
  167. /// <param name="binFilePath"></param>
  168. /// <returns></returns>
  169. public static T DeserializeObjectFromBinaryFile<T>(string binFilePath)
  170. {
  171. T obj = default(T);
  172. using (FileStream fs = new FileStream(binFilePath, FileMode.OpenOrCreate))
  173. {
  174. obj = (T)DeserializeObjectFromBinaryStream(fs);
  175. }
  176. return obj;
  177. }
  178. /// <summary>
  179. /// Deserialize supplied stream using BinaryFormatter
  180. /// </summary>
  181. /// <param name="stream"></param>
  182. /// <returns></returns>
  183. public static object DeserializeObjectFromBinaryStream(Stream stream)
  184. {
  185. IFormatter formatter = new BinaryFormatter();
  186. var retVal = formatter.Deserialize(stream);
  187. return retVal;
  188. }
  189. /// <summary>
  190. /// Deserialize supplied stream using XmlSerializer to specified type of object
  191. /// </summary>
  192. /// <param name="stream"></param>
  193. /// <param name="typeOfObject"></param>
  194. /// <returns></returns>
  195. public static object DeserializeObjectFromStream(Stream stream, Type typeOfObject)
  196. {
  197. try
  198. {
  199. var serializer = new XmlSerializer(typeOfObject);
  200. object retVal = serializer.Deserialize(stream);
  201. return retVal;
  202. }
  203. catch (Exception ex)
  204. {
  205. LOG.Error(string.Format("界面发序列化数据出错:\n函数名:{0}\n串行数据内容:{1}",
  206. System.Reflection.MethodInfo.GetCurrentMethod().Name,
  207. stream.ToString()), ex);
  208. throw;
  209. }
  210. }
  211. /// <summary>
  212. /// Deserialize supplied stream using XmlSerializer to specified tyep of object
  213. /// </summary>
  214. /// <param name="stream"></param>
  215. /// <param name="typeOfObject"></param>
  216. /// <param name="types"></param>
  217. /// <returns></returns>
  218. public static object DeserializeObjectFromStream(Stream stream, Type typeOfObject, Type[] types)
  219. {
  220. types = RemoveDuplicateType(typeOfObject, types);
  221. var serializer = new XmlSerializer(typeOfObject, types);
  222. object retVal = serializer.Deserialize(stream);
  223. return retVal;
  224. }
  225. /// <summary>
  226. /// Convert supplied string to xml stream, then deserialize the xml stream to specified type of object
  227. /// </summary>
  228. /// <param name="xml"></param>
  229. /// <param name="typeToDeserialize"></param>
  230. /// <returns></returns>
  231. public static object DeserializeObjectFromXml(string xml, Type typeToDeserialize)
  232. {
  233. if (string.IsNullOrWhiteSpace(xml))
  234. {
  235. return null;
  236. }
  237. using (var memoryStream = new MemoryStream())
  238. {
  239. var xmlDoc = new XmlDocument();
  240. xmlDoc.LoadXml(xml);
  241. xmlDoc.Save(memoryStream);
  242. memoryStream.Seek(0, SeekOrigin.Begin);
  243. return DeserializeObjectFromStream(memoryStream, typeToDeserialize);
  244. }
  245. }
  246. /// <summary>
  247. /// Convert xml file content to object
  248. /// </summary>
  249. /// <typeparam name="T"></typeparam>
  250. /// <param name="xmlFilePath"></param>
  251. /// <returns></returns>
  252. public static T DeserializeObjectFromXmlFile<T>(string xmlFilePath)
  253. {
  254. T obj = default(T);
  255. FileInfo fi = new FileInfo(xmlFilePath);
  256. if (!fi.Exists) return obj;
  257. using (StreamReader reader = new StreamReader(xmlFilePath))
  258. {
  259. if (string.IsNullOrWhiteSpace(reader.ReadToEnd())) return obj;
  260. }
  261. using (FileStream fs = new FileStream(xmlFilePath, FileMode.Open))
  262. {
  263. obj = DeserializeObjectFromStream<T>(fs);
  264. }
  265. return obj;
  266. }
  267. }
  268. }