net中对象序列化技术浅谈.docx

上传人:b****3 文档编号:3887552 上传时间:2023-05-06 格式:DOCX 页数:15 大小:254.80KB
下载 相关 举报
net中对象序列化技术浅谈.docx_第1页
第1页 / 共15页
net中对象序列化技术浅谈.docx_第2页
第2页 / 共15页
net中对象序列化技术浅谈.docx_第3页
第3页 / 共15页
net中对象序列化技术浅谈.docx_第4页
第4页 / 共15页
net中对象序列化技术浅谈.docx_第5页
第5页 / 共15页
net中对象序列化技术浅谈.docx_第6页
第6页 / 共15页
net中对象序列化技术浅谈.docx_第7页
第7页 / 共15页
net中对象序列化技术浅谈.docx_第8页
第8页 / 共15页
net中对象序列化技术浅谈.docx_第9页
第9页 / 共15页
net中对象序列化技术浅谈.docx_第10页
第10页 / 共15页
net中对象序列化技术浅谈.docx_第11页
第11页 / 共15页
net中对象序列化技术浅谈.docx_第12页
第12页 / 共15页
net中对象序列化技术浅谈.docx_第13页
第13页 / 共15页
net中对象序列化技术浅谈.docx_第14页
第14页 / 共15页
net中对象序列化技术浅谈.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

net中对象序列化技术浅谈.docx

《net中对象序列化技术浅谈.docx》由会员分享,可在线阅读,更多相关《net中对象序列化技术浅谈.docx(15页珍藏版)》请在冰点文库上搜索。

net中对象序列化技术浅谈.docx

net中对象序列化技术浅谈

序列化是将对象转换为容易传输的格式的过程。

例如,可以序列化一个对象,然后使用HTTP通过Internet在客户端和服务器之间传输该对象。

反之,反序列化根据流重新构造对象。

在.net中有提供了几种序列化的方式:

二进制序列化

XML序列化

SOAP序列化

 

二进制序列化

所谓二进制序列化,指的是对象序列化之后是二进制形式的。

二进制序列化是通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。

XML序列化

所谓XML序列化,是指对象序列化之后的结果是XML形式的。

保存XML序列化是通过XmlSerializer类来实现的,这个类位于System.Xml.Serialization命名空间下。

SOAP序列化

所谓SOAP序列化是指对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP协议传输(不知道SOAP协议?

XX一下吧)。

SOAP序列化是通过SoapFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Soap命名空间下,并且需要注意需要手动添加对这个命名空间的引用,如下图所示:

 

下面编写一个类用于序列化和反序列化,这个类的代码如下:

1.using System;  

2.using System.Collections.Generic;  

3.using System.Text;  

4.  

5.namespace MySerializeDemo  

6.{  

7.    [Serializable]  

8.    /// 

  

9.    /// 要序列化的对象  

10.    /// 作者:

周公  

11.    /// 编写时间:

2009-03-10  

12.    /// 

  

13.    public class MyObject  

14.    {  

15.        //[NonSerialized]  

16.        private string name;  

17.        private DateTime birthday;  

18.        private string homePlace;  

19.        /// 

  

20.        /// 出生地  

21.        /// 

  

22.        public string HomePlace  

23.        {  

24.            get { return homePlace; }  

25.            set { homePlace = value; }  

26.        }  

27.   

28.        /// 

  

29.        /// 生日  

30.        /// 

  

31.        public DateTime Birthday  

32.        {  

33.            get { return birthday; }  

34.            set { birthday = value; }  

35.        }  

36.   

37.        /// 

  

38.        /// 姓名  

39.        /// 

  

40.        public string Name  

41.        {  

42.            get { return name; }  

43.            set { name = value; }  

44.        }  

45.   

46.        /// 

  

47.        /// 年龄  

48.        /// 

  

49.        public int Age  

50.        {  

51.            get { return DateTime.Now.Year - birthday.Year; }  

52.        }  

53.        /// 

  

54.        /// override了ToString()方法  

55.        /// 

  

56.        ///   

57.        public override string ToString()  

58.        {  

59.            return string.Format("姓名:

{0},生日:

{1},出生地:

{2},年龄:

{3}",name,birthday,homePlace,Age);  

60.        }  

61.   

62.    }  

63.}  

下面是分别用上面的三个类进行序列化和反序列化的代码:

viewplaincopytoclipboardprint?

1.using System;  

2.using System.Collections.Generic;  

3.using System.Text;  

4.using System.IO;  

5.using System.Runtime.Serialization.Formatters;  

6.using System.Runtime.Serialization.Formatters.Binary;  

7.using System.Runtime.Serialization.Formatters.Soap;  

8.using System.Xml.Serialization;  

9.  

10.namespace MySerializeDemo  

11.{  

12.    class Program  

13.    {  

14.        static void Main(string[] args)  

15.        {  

16.            MyObject obj = new MyObject();  

17.            obj.Birthday = new DateTime(1979, 11, 7);  

18.            obj.HomePlace = "湖北";  

19.            obj.Name = "周公";  

20.            Console.WriteLine("========使用BinaryFormatter类进行序列化和反序列化。

====");  

21.            BinarySerialize(obj);  

22.            BinaryDeserialize("C:

\\MyObject.dat");  

23.            Console.WriteLine("========使用SoapFormatter类进行序列化和反序列化。

====");  

24.            SOAPSerialize(obj);  

25.            SOAPDeserialize("C:

\\MyObject.soap");  

26.            Console.WriteLine("========使用XmlSerializer类进行序列化和反序列化。

====");  

27.            XMLSerialize(obj);  

28.            XMLDeserialize("C:

\\MyObject.xml");  

29.        }  

30.        /// 

  

31.        /// 二进制序列化对象  

32.        /// 

  

33.        ///   

34.        public static void BinarySerialize(MyObject obj)  

35.        {  

36.            using (FileStream stream = new FileStream("C:

\\MyObject.dat", FileMode.Create, FileAccess.Write))  

37.            {  

38.                BinaryFormatter formater = new BinaryFormatter();  

39.                formater.Serialize(stream, obj);  

40.                Console.WriteLine("对象已经被序列化。

" + obj.ToString());  

41.            }  

42.        }  

43.        /// 

  

44.        /// 二进制反序列化  

45.        /// 

  

46.        ///   

47.        public static void BinaryDeserialize(string fileName)  

48.        {  

49.            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))  

50.            {  

51.                BinaryFormatter formater = new BinaryFormatter();  

52.                MyObject obj=(MyObject)formater.Deserialize(stream);  

53.                Console.WriteLine("对象已经被反序列化。

" + obj.ToString());  

54.            }  

55.        }  

56.  

57.        /// 

  

58.        /// 二进制序列化对象  

59.        /// 

  

60.        ///   

61.        public static void SOAPSerialize(MyObject obj)  

62.        {  

63.            using (FileStream stream = new FileStream("C:

\\MyObject.soap", FileMode.Create, FileAccess.Write))  

64.            {  

65.                SoapFormatter formater = new SoapFormatter();  

66.                formater.Serialize(stream, obj);  

67.                Console.WriteLine("对象已经被序列化。

" + obj.ToString());  

68.            }  

69.        }  

70.        /// 

  

71.        /// 二进制反序列化  

72.        /// 

  

73.        ///   

74.        public static void SOAPDeserialize(string fileName)  

75.        {  

76.            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))  

77.            {  

78.                SoapFormatter formater = new SoapFormatter();  

79.                MyObject obj = (MyObject)formater.Deserialize(stream);  

80.                Console.WriteLine("对象已经被反序列化。

" + obj.ToString());  

81.            }  

82.        }  

83.        /// 

  

84.        /// XML序列化  

85.        /// 

  

86.        ///   

87.        public static void XMLSerialize(MyObject obj)  

88.        {  

89.            using (FileStream stream = new FileStream("C:

\\MyObject.xml", FileMode.Create, FileAccess.Write))  

90.            {  

91.                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));  

92.                serializer.Serialize(stream, obj);  

93.                Console.WriteLine("对象已经被序列化。

" + obj.ToString());  

94.            }  

95.        }  

96.        /// 

  

97.        /// XML反序列化  

98.        /// 

  

99.        ///   

100.        public static void XMLDeserialize(string fileName)  

101.        {  

102.            using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))  

103.            {  

104.                XmlSerializer serializer = new XmlSerializer(typeof(MyObject));  

105.                MyObject obj = (MyObject)serializer.Deserialize(stream);  

106.                Console.WriteLine("对象已经被反序列化。

" + obj.ToString());  

107.            }  

108.        }  

109.    }  

110.}  

这个程序的运行效果如下:

 

可见通过上面三个类都能实现将对象序列化保存,并且都能反序列化还原到对象被序列化之前的状态(这正是序列化意义所在,能保存对象运行时的状态并且还能还原)。

如果运行上面的代码会在C盘根目录下创建三个文件,分别是MyObject.dat、MyObject.soap和MyObject.xml文件,因为MyObject.dat是二进制文件,所以无法查看文件的内容,但是我们可以打开MyObject.soap和MyObject.xml这两个文件来比较一下有什么区别。

MyObject.soap文件的后缀虽然是.soap,但是还是可以用记事本打开的,下面是MyObject.soap文件的内容:

viewplaincopytoclipboardprint?

1.

Envelope xmlns:

xsi="http:

//www.w3.org/2001/XMLSchema-instance" xmlns:

xsd="http:

//www.w3.org/2001/XMLSchema" xmlns:

SOAP-ENC="http:

//schemas.xmlsoap.org/soap/encoding/" xmlns:

SOAP-ENV="http:

//schemas.xmlsoap.org/soap/envelope/" xmlns:

clr=" SOAP-ENV:

encodingStyle="http:

//schemas.xmlsoap.org/soap/encoding/">  

2.

Body>  

3.

MyObject id="ref-1" xmlns:

a1="  

4.周公  

5.1979-11-07T00:

00:

00.0000000+08:

00  

6.湖北  

7.

MyObject>  

8.

Body>  

9.

Envelope>  

MyObject.xml文件也可以用记事本打开,它的内容如下:

viewplaincopytoclipboardprint?

1.

xml version="1.0"?

>  

2.

xsi="http:

//www.w3.org/2001/XMLSchema-instance" xmlns:

xsd="http:

//www.w3.org/2001/XMLSchema">  

3.  湖北  

4.  1979-11-07T00:

00:

00  

5.  周公  

6.  

熟悉SOAP协议的朋友一看MyObject.soap文件的内容就知道它符合SOAP协议,MyObject.xml文件毫无疑问是一个符合XML规范的文件。

对代码作几点说明:

1、如果采用BinaryFormatter类或者SoapFormatter类来实现序列化,则一定要给类加上Serializable属性,如代码中所示:

viewplaincopytoclipboardprint?

1.[Serializable]  

2.    /// 

  

3.    /// 要序列化的对象  

4.    /// 作者:

周公  

5.    /// 编写时间:

2009-03-10  

6.    /// 

  

7.    public class MyObject  

如果不给要序列化的对象加上这个属性,那么采用采用BinaryFormatter类或者SoapFormatter类来实现序列化时会报异常,但使用XmlSerializer类序列化对象时可以不用这个属性。

2、另外,如果不想序列化某个字段,可以给其加上NonSerialized属性,这样在序列化时就不会保存这个这个字段的值了,比如不想序列化name这个字段,可以如下写代码:

viewplaincopytoclipboardprint?

1.…//其它代码  

2.//[NonSerialized]  

3.private string name;  

4.…//其它代码  

再次运行刚才的程序会得到如下效果:

 

看有黄色底线部分,因为name字段不被序列化,所以通过二进制序列化和SOAP序列化之后再反序化就得不到原来的值了。

3、最后还需要说明一点的是,SoapFormatter类在.net3.5开始已经过时了,微软建议使用BinaryFormatter类来序列化和反序列化了。

周公

2009-03-110:

17

发表于@2009年03月11日09:

46:

00|评论(loading...)|收藏

 | 旧一篇:

 值得一读的《框架设计(第2版):

CLRViaC#》

评论

gisfarmer 发表于2009-03-1111:

03:

33  IP:

218.249.91.*

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2