当前位置:编程学习 > asp >>

.net中的对象序列化(2):三种序列化方式

.Net框架中提供了3中序列化的方式, 分别是:
• Binary Serializer
• Soap Serializer
• XML Serializer
1. Binary Serializer
如果需要序列化这个类的对象,那么这个类必须要标记为是可序列化的。需要用到特性 [Serializable] (作用域是Class, Struct, Enum, Delegate)
如果某些变量不需要序列化, 或者不能序列化可以使用[NonSerialized], (作用域是Field)
需要注意, 如果类中使用了其它的类属性,如果希望它们能序列化,那么其它的类也必须是可序列化的, 如下面类DethDisease
 
 1 namespace SerializationDemo
 2 {
 3     [Serializable]
 4     public class Person
 5     {
 6         [NonSerialized]
 7         private int _age;
 8         public int Age
 9         {
10             get
11             {
12                 return _age;
13             }
14             set
15             {
16                 _age = value;
17             }
18         }
19         public DethDisease Disease
20         {
21             get;
22             set;
23         }
24         public string Medicine
25         {
26             get;
27             set;
28         }
29         public Person()
30         {
31             Age = 0;
32         }
33         public bool Live()
34         {
35             Age++;
36             if (Disease != null && !Disease.CanLive(Age, Medicine))
37                 return false;
38             return true;
39         }
40     }
41 }

 
二进制序列化的代码, 主要是这个BinaryFormatter.
 
1 IFormatter formatter = new BinaryFormatter();
2 Stream stream = new FileStream("Person", FileMode.Create, FileAccess.Write, FileShare.None);
3 formatter.Serialize(stream, newPerson);
4 stream.Close();

 
 
反序列化
 
1 IFormatter formatter = new BinaryFormatter();
2 Stream stream = new FileStream("Person", FileMode.Open, FileAccess.Read, FileShare.Read);
3 newPerson = (Person)formatter.Deserialize(stream);
4 stream.Close();

 
 
2. Soap Serializer
基本和上面的一样,只是用到不同的IFormatter实现,SoapFormatter
 
3. XML Serializer
使用xml Serializer, 不需要使用特性[Serializable]
使用xml Serializer, 有相关的一些其它特性来改变xml的输出结果。
 
XmlRoot: 作用于类根元素, 控制根元素的输出
XmlElement: 作用于类的属性或field
XmlAttribute: 作为属性输出,而不是节点
XmlIgnore: 不输出
XmlText: 必须是字符串类型, 一个类中只能有一个这个特性, 没有标签包裹,也不作为属性
XmlArray: 作用于数组类型, 可以控制数组的输出
这里是常用的序列化xml的核心方法
 
 1  public static string XmlSerialize<T>(T obj)
 2       {
 3           string xmlString = string.Empty;
 4           XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
 5           using (MemoryStream ms = new MemoryStream())
 6           {
 7               xmlSerializer.Serialize(ms, obj);
 8               xmlString = Encoding.UTF8.GetString(ms.ToArray());
 9           }
10           return xmlString;
11       }
12       public static T XmlDeserialize<T>(string xmlString)
13       {
14           T t = default(T);
15           XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
16           using (Stream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString)))
17           {
18               using (XmlReader xmlReader = XmlReader.Create(xmlStream))
19               {
20                   Object obj = xmlSerializer.Deserialize(xmlReader);
21                   t = (T)obj;
22               }
23           }
24           return t;
25       }

 
 
三种方式比较:
Binary方式效率最高,可读性不如后两种好。
Soap方式可以用于跨平台传输, xml方式简单易用,用于程序内部使用,灵活方便。
 
相关源代码: SerializationDemo/2012/0326/20120326113540865.zip
 

 

摘自  JustRun1983
 
补充:Web开发 , ASP.Net ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,