2012年4月22日星期日

asp.net 序列化方法

asp.net 序列化方法

  1. 序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。
  2. .NET框架提供了两种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用SoapFormatter进行串行化;3、使用
  3. 可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、2可以使用[NonSerialized]属性来标志,2、可以使用[
  4. 1、使用BinaryFormatter进行串行化
  5. 下面是一个可串行化的类:
  6. using System;
  7. using System.Data;
  8. using System.Configuration;
  9. using System.Web;
  10. using System.Web.Security;
  11. using System.Web.UI;
  12. using System.Web.UI.WebControls;
  13. using System.Web.UI.WebControls.WebParts;
  14. using System.Web.UI.HtmlControls;
  15. using System.IO;
  16. using System.Runtime.Serialization.Formatters.Binary;
  17. /**//// <summary>
  18. /// ClassToSerialize 的摘要说明
  19. /// </summary>
  20. [Serializable]
  21. publicclass ClassToSerialize
  22. {
  23. publicint id = 100;
  24. publicstring name = "Name";
  25. [NonSerialized]
  26. publicstring Sex = "男";
  27. }
  28. 下面是串行化和反串行化的方法:
  29. publicvoid SerializeNow()
  30. {
  31. ClassToSerialize c = new ClassToSerialize();
  32. FileStream fileStream = new FileStream("c://temp.dat", FileMode.Create);
  33. BinaryFormatter b = new BinaryFormatter();
  34. b.Serialize(fileStream, c);
  35. fileStream.Close();
  36. }
  37. publicvoid DeSerializeNow()
  38. {
  39. ClassToSerialize c = new ClassToSerialize();
  40. c.Sex = "kkkk";
  41. FileStream fileStream = new FileStream("c://temp.dat", FileMode.Open, FileAccess.Read, FileShare.Read);
  42. BinaryFormatter b = new BinaryFormatter();
  43. c = b.Deserialize(fileStream) as ClassToSerialize;
  44. Response.Write(c.name);
  45. Response.Write(c.Sex);
  46. fileStream.Close();
  47. }
  48. 调用上述两个方法就可以看到串行化的结果:Sex属性因为被标志为[NonSerialized],故其值总是为null。
  49. 2、使用SoapFormatter进行串行化
  50. 和BinaryFormatter类似,我们只需要做一下简单修改即可:
  51. a.将using语句中的.Formatter.Binary改为.Formatter.Soap;
  52. b.将所有的BinaryFormatter替换为SoapFormatter.
  53. c.确保报存文件的扩展名为.
  54. 经过上面简单改动,即可实现SoapFormatter的串行化,这时候产生的文件就是一个
  55. 3、使用
  56. 关于格式化器还有一个问题,假设我们需要
  57. 如果我们不想使用主流的串行化机制,而想使用
  58. a.添加System.
  59. b.Serializable和NoSerialized属性将被忽略,而是使用
  60. c.
  61. 下面看示例:
  62. 要序列化的类:
  63. using System;
  64. using System.Data;
  65. using System.Configuration;
  66. using System.Web;
  67. using System.Web.Security;
  68. using System.Web.UI;
  69. using System.Web.UI.WebControls;
  70. using System.Web.UI.WebControls.WebParts;
  71. using System.Web.UI.HtmlControls;
  72. using System.
  73. [Serializable]
  74. publicclass Person
  75. {
  76. privatestring name;
  77. publicstring Name
  78. {
  79. get
  80. {
  81. return name;
  82. }
  83. set
  84. {
  85. name = value;
  86. }
  87. }
  88. publicstring Sex;
  89. publicint Age = 31;
  90. public Course[] Courses;
  91. public Person()
  92. {
  93. }
  94. public Person(string Name)
  95. {
  96. name = Name;
  97. Sex = "男";
  98. }
  99. }
  100. [Serializable]
  101. publicclass Course
  102. {
  103. publicstring Name;
  104. [
  105. publicstring Description;
  106. public Course()
  107. {
  108. }
  109. public Course(string name, string description)
  110. {
  111. Name = name;
  112. Description = description;
  113. }
  114. }
  115. 序列化和反序列化方法:
  116. publicvoid
  117. {
  118. Person c = new Person("cyj");
  119. c.Courses = new Course[2];
  120. c.Courses[0] = new Course("英语", "交流工具");
  121. c.Courses[1] = new Course("数学","自然科学");
  122. new typeof(Person));
  123. Stream stream = new FileStream("c://cyj.,FileMode.Create,FileAccess.Write,FileShare.Read);
  124. xs.Serialize(stream,c);
  125. stream.Close();
  126. }
  127. publicvoid
  128. {
  129. new typeof(Person));
  130. Stream stream = new FileStream("C://cyj.,FileMode.Open,FileAccess.Read,FileShare.Read);
  131. Person p = xs.Deserialize(stream) as Person;
  132. Response.Write(p.Name);
  133. Response.Write(p.Age.ToString());
  134. Response.Write(p.Courses[0].Name);
  135. Response.Write(p.Courses[0].Description);
  136. Response.Write(p.Courses[1].Name);
  137. Response.Write(p.Courses[1].Description);
  138. stream.Close();
  139. }
  140. 这里Course类的Description属性值将始终为null,生成的
  141. <?"1.0"?>
  142. <Person "http://www.w3.org/2001/ "http://www.w3.org/2001/>
  143. <Sex>男</Sex>
  144. <Age>31</Age>
  145. <Courses>
  146. <Course>
  147. <Name>英语</Name>
  148. <Description>交流工具</Description>
  149. </Course>
  150. <Course>
  151. <Name>数学</Name>
  152. <Description>自然科学</Description>
  153. </Course>
  154. </Courses>
  155. <Name>cyj</Name>
  156. </Person>
  157. 4、自定义序列化
  158. 如果你希望让用户对类进行串行化,但是对数据流的组织方式不完全满意,那么可以通过在自定义类中实现接口来自定义串行化行为。这个接口只有一个方法,GetObjectData. 这个方法用于将对类对象进行串行化所需要的数据填进SerializationInfo对象。你使用的格式化器将构造SerializationInfo对象,然后在串行化时调用GetObjectData. 如果类的父类也实现了ISerializable,那么应该调用GetObjectData的父类实现。
  159. 如果你实现了ISerializable,那么还必须提供一个具有特定原型的构造器,这个构造器的参数列表必须与GetObjectData相同。这个构造器应该被声明为私有的或受保护的,以防止粗心的开发人员直接使用它。
  160. 示例如下:
  161. 实现ISerializable的类:
  162. using System;
  163. using System.Data;
  164. using System.Configuration;
  165. using System.Web;
  166. using System.Web.Security;
  167. using System.Web.UI;
  168. using System.Web.UI.WebControls;
  169. using System.Web.UI.WebControls.WebParts;
  170. using System.Web.UI.HtmlControls;
  171. using System.Runtime.Serialization;
  172. using System.Runtime.Serialization.Formatters.Binary;
  173. /**//// <summary>
  174. /// Employee 的摘要说明
  175. /// </summary>
  176. [Serializable]
  177. publicclass Employee:ISerializable
  178. {
  179. publicint EmpId=100;
  180. publicstring EmpName="刘德华";
  181. [NonSerialized]
  182. publicstring NoSerialString = "NoSerialString-Test";
  183. public Employee()
  184. {
  185. //
  186. // TODO: 在此处添加构造函数逻辑
  187. //
  188. }
  189. private Employee(SerializationInfo info, StreamingContext ctxt)
  190. {
  191. EmpId = (int)info.GetValue("EmployeeId", typeof(int));
  192. EmpName = (String)info.GetValue("EmployeeName",typeof(string));
  193. //NoSerialString = (String)info.GetValue("EmployeeString",typeof(string));
  194. }
  195. publicvoid GetObjectData(SerializationInfo info, StreamingContext ctxt)
  196. {
  197. info.AddValue("EmployeeId", EmpId);
  198. info.AddValue("EmployeeName", EmpName);
  199. //info.AddValue("EmployeeString", NoSerialString);
  200. }
  201. }
  202. 序列化和反序列化方法:
  203. publicvoid OtherEmployeeClassTest()
  204. {
  205. Employee mp = new Employee();
  206. mp.EmpId = 10;
  207. mp.EmpName = "邱枫";
  208. mp.NoSerialString = "你好呀";
  209. Stream steam = File.Open("c://temp3.dat", FileMode.Create);
  210. BinaryFormatter bf = new BinaryFormatter();
  211. Response.Write("Writing Employee Info:");
  212. bf.Serialize(steam,mp);
  213. steam.Close();
  214. mp = null;
  215. //反序列化
  216. Stream steam2 = File.Open("c://temp3.dat", FileMode.Open);
  217. BinaryFormatter bf2 = new BinaryFormatter();
  218. Response.Write("Reading Employee Info:");
  219. Employee mp2 = (Employee)bf2.Deserialize(steam2);
  220. steam2.Close();
  221. Response.Write(mp2.EmpId);
  222. Response.Write(mp2.EmpName);
  223. Response.Write(mp2.NoSerialString);
  224. }

TAG: