大兵的网上家园
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 178 文章- 1 评论- 70
序列化和反序列化
序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
我想最主要的作用有:
1、在进程下次启动时读取上次保存的对象的信息
2、在不同的AppDomain或进程之间传递数据
3、在分布式应用系统中传递数据
......
在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化
本文就通过一个小例子主要说说这三种方法的具体使用和异同点
这个例子就是使用三种不同的方式把一个Book对象进行序列化和反序列化,当然这个Book类首先是可以被序列化的。至于怎么使一个类可以序列化可以参见:
Book类
using
System;
using
System.Collections;
using
System.Text;
namespace
SerializableTest
{
[Serializable]
public
class
Book
{
public
Book()
{
alBookReader
=
new
ArrayList();
}
public
string
strBookName;
[NonSerialized]
public
string
strBookPwd;
private
string
_bookID;
public
string
BookID
{
get
{
return
_bookID; }
set
{ _bookID
=
value; }
}
public
ArrayList alBookReader;
private
string
_bookPrice;
public
void
SetBookPrice(
string
price)
{
_bookPrice
=
price;
}
public
void
Write()
{
Console.WriteLine(
"
Book ID:
"
+
BookID);
Console.WriteLine(
"
Book Name:
"
+
strBookName);
Console.WriteLine(
"
Book Password:
"
+
strBookPwd);
Console.WriteLine(
"
Book Price:
"
+
_bookPrice);
Console.WriteLine(
"
Book Reader:
"
);
for
(
int
i
=
0
; i
<
alBookReader.Count; i
++
)
{
Console.WriteLine(alBookReader[i]);
}
}
}
}
这个类比较简单,就是定义了一些public字段和一个可读写的属性,一个private字段,一个标记为[NonSerialized]的字段,具体会在下面的例子中体现出来
一、BinaryFormatter序列化方式
1、序列化,就是给Book类赋值,然后进行序列化到一个文件中
Book book
=
new
Book();
book.BookID
=
"
1
"
;
book.alBookReader.Add(
"
gspring
"
);
book.alBookReader.Add(
"
永春
"
);
book.strBookName
=
"
C#强化
"
;
book.strBookPwd
=
"
*****
"
;
book.SetBookPrice(
"
50.00
"
);
BinarySerialize serialize
=
new
BinarySerialize();
serialize.Serialize(book);
2、反序列化
BinarySerialize serialize
=
new
BinarySerialize();
Book book
=
serialize.DeSerialize();
book.Write();
3、测试用的
BinarySerialize类
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.IO;
using
System.Runtime.Serialization.Formatters.Binary;
namespace
SerializableTest
{
public
class
BinarySerialize
{
string
strFile
=
"
c:\\book.data
"
;
public
void
Serialize(Book book)
{
using
(FileStream fs
=
new
FileStream(strFile, FileMode.Create))
{
BinaryFormatter formatter
=
new
BinaryFormatter();
formatter.Serialize(fs, book);
}
}
public
Book DeSerialize()
{
Book book;
using
(FileStream fs
=
new
FileStream(strFile, FileMode.Open))
{
BinaryFormatter formatter
=
new
BinaryFormatter();
book
=
(Book)formatter.Deserialize(fs);
}
return
book;
}
}
}
主要就是调用System.Runtime.Serialization.Formatters.Binary空间下的BinaryFormatter类进行序列化和反序列化,以缩略型二进制格式写到一个文件中去,速度比较快,而且写入后的文件已二进制保存有一定的保密效果。
调用反序列化后的截图如下:
也就是说除了标记为NonSerialized的其他所有成员都能序列化
二、SoapFormatter序列化方式
调用序列化和反序列化的方法和上面比较类似,我就不列出来了,主要就看看SoapSerialize类
SoapSerialize类
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.IO;
using
System.Runtime.Serialization.Formatters.Soap;
namespace
SerializableTest
{
public
class
SoapSerialize
{
string
strFile
=
"
c:\\book.soap
"
;
public
void
Serialize(Book book)
{
using
(FileStream fs
=
new
FileStream(strFile, FileMode.Create))
{
SoapFormatter formatter
=
new
SoapFormatter();
formatter.Serialize(fs, book);
}
}
public
Book DeSerialize()
{
Book book;
using
(FileStream fs
=
new
FileStream(strFile, FileMode.Open))
{
SoapFormatter formatter
=
new
SoapFormatter();
book
=
(Book)formatter.Deserialize(fs);
}
return
book;
}
}
}
主要就是调用System.Runtime.Serialization.Formatters.Soap空间下的SoapFormatter类进行序列化和反序列化,使用之前需要应用System.Runtime.Serialization.Formatters.Soap.dll(.net自带的)
序列化之后的文件是Soap格式的文件(
简单对象访问协议(Simple Object Access Protocol,SOAP),是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。
)
调用反序列化之后的结果和方法一相同
三、XML序列化方式
调用序列化和反序列化的方法和上面比较类似,我就不列出来了,主要就看看XmlSerialize类
XmlSerialize类
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.IO;
using
System.Xml.Serialization;
namespace
SerializableTest
{
public
class
XmlSerialize
{
string
strFile
=
"
c:\\book.xml
"
;
public
void
Serialize(Book book)
{
using
(FileStream fs
=
new
FileStream(strFile, FileMode.Create))
{
XmlSerializer formatter
=
new
XmlSerializer(
typeof
(Book));
formatter.Serialize(fs, book);
}
}
public
Book DeSerialize()
{
Book book;
using
(FileStream fs
=
new
FileStream(strFile, FileMode.Open))
{
XmlSerializer formatter
=
new
XmlSerializer(
typeof
(Book));
book
=
(Book)formatter.Deserialize(fs);
}
return
book;
}
}
}
从这三个测试类我们可以看出来其实三种方法的调用方式都差不多,只是具体使用的类不同
xml序列化之后的文件就是一般的一个xml文件:
book.xml
<?
xml version="1.0"
?>
<
Book
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
>
<
strBookName
>
C#强化
</
strBookName
>
<
strBookPwd
>
*****
</
strBookPwd
>
<
alBookReader
>
<
anyType
xsi:type
="xsd:string"
>
gspring
</
anyType
>
<
anyType
xsi:type
="xsd:string"
>
永春
</
anyType
>
</
alBookReader
>
<
BookID
>
1
</
BookID
>
</
Book
>
输出截图如下:
也就是说采用xml序列化的方式只能保存public的字段和可读写的属性,对于private等类型的字段不能进行序列化
关于循环引用:
比如在上面的例子Book类中加入如下一个属性:
public Book relationBook;
在调用序列化时使用如下方法:
Book book
=
new
Book();
book.BookID
=
"
1
"
;
book.alBookReader.Add(
"
gspring
"
);
book.alBookReader.Add(
"
永春
"
);
book.strBookName
=
"
C#强化
"
;
book.strBookPwd
=
"
*****
"
;
book.SetBookPrice(
"
50.00
"
);
Book book2
=
new
Book();
book2.BookID
=
"
2
"
;
book2.alBookReader.Add(
"
gspring
"
);
book2.alBookReader.Add(
"
永春
"
);
book2.strBookName
=
"
.NET强化
"
;
book2.strBookPwd
=
"
*****
"
;
book2.SetBookPrice(
"
40.00
"
);
book.relationBook
=
book2;
book2.relationBook
=
book;
BinarySerialize serialize
=
new
BinarySerialize();
serialize.Serialize(book);
这样就会出现循环引用的情况,对于BinarySerialize和SoapSerialize可以正常序列化(.NET内部进行处理了),对于XmlSerialize出现这种情况会报错:
"序列化类型 SerializableTest.Book 的对象时检测到循环引用。"
posted @ 2008-05-22 17:29
大 兵
阅读(76)
评论(0)
编辑
收藏
所属分类:
.NET2.0
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-05-22 17:34 编辑过
相关文章:
经典推荐--.NET几大热点问题(.NET人员必读)
经典推荐--.NET几大热点问题(.NET人员必读)
关于IE问题,请教和求救
.Net的序列化和反序列化
.NET连DB2数据库的方法
ASP.NET下如何浏览客户端文件夹
.NET多好
.NET 设计规范
相关链接:
所属分类的其他文章:
提高C#编程水平的50个要诀
你必须知道的C#的25个基础概念
property.js
XML与DataTable互转
大牛的文章集锦
.Net源码之Page类
序列化和反序列化
动态代码的使用(反射和动态生成类)
应用程序域(AppDomain)浅析
匿名方法的使用
最新IT新闻:
11个处于悬崖边缘的 Web 公司
扎克博格:Facebook要先赚吆喝后赚钱
金融风暴改写富豪榜排名 巴菲特资产超盖茨
红杉资本发出严重警告:黄金时代已成历史
2008年10月11日科技博客精选
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
我参加的小组
OOAD&UML
随笔分类
.NET1.1
(rss)
.NET2.0(47)
(rss)
Active Dictionary(7)
(rss)
Ajax(5)
(rss)
AOP
(rss)
Enterprise Library(3)
(rss)
FlashCom(1)
(rss)
IOC(2)
(rss)
JavaScript(2)
(rss)
NUnit(2)
(rss)
SOA(21)
(rss)
持久层(19)
(rss)
多线程(2)
(rss)
概念理解(9)
(rss)
软件构架(5)
(rss)
设计案例(2)
(rss)
设计模式(20)
(rss)
实战(3)
(rss)
项目实施(9)
(rss)
项目文档(2)
(rss)
异常处理(1)
(rss)
杂谈(18)
(rss)
随笔档案
2008年10月 (3)
2008年9月 (5)
2008年8月 (12)
2008年7月 (15)
2008年6月 (12)
2008年5月 (18)
2008年4月 (11)
2008年3月 (22)
2008年2月 (9)
2008年1月 (15)
2007年11月 (4)
2007年10月 (5)