aspgreener的专栏
人生的自由 本人做的小站【小事一箩筐】欢迎访问 http://www.xiaoshiyiluokuang.com
登录
注册
全站
当前博客
空间
博客
好友
相册
论坛
留言
用户操作
[即时聊天]
[发私信]
[加为好友]
水若寒
ID:aspgreener
共
48645
次访问,排名
2376
,好友
100
人,关注者
105
人。
电脑,购物,旅游,美食,网游,文学,影视,游泳,娱乐,IT技术,IT,music,电影,音乐,读书,流行音乐
aspgreener的文章
原创 81 篇
翻译 1 篇
转载 155 篇
评论 58 篇
aspgreener的公告
小事一箩筐,让你笑翻了^_^
箩筐.Net采集器
希望大家一起学习进步,有什么问题请与我联系。Msn:nnu_zyj@hotmail.com QQ:49940396
统计:
最近评论
zhengguangyi130:
顶..太有意思了...哈哈
l8x88b:
倒晕
不好意思啊!
一发就是两个出来
l8x88b:
倒晕
不好意思啊!
一发就是两个出来
l8x88b:
Print2Flash控件
这个控件您用过吗?哪有,我找了下没找到
谢谢!
l8x88b:
Print2Flash控件
这个控件您用过吗?哪有,我找了下没找到
谢谢!
文章分类
ASP
(RSS)
ASP.NET
(RSS)
JavaScript
(RSS)
Lucene.Net
(RSS)
MySql
(RSS)
PHP
(RSS)
SEO
(RSS)
SQL SERVER
(RSS)
其它
(RSS)
收藏
ASP
ASP.NET
相册
存档
2008年11月(7)
2008年10月(17)
2008年09月(6)
2008年08月(3)
2008年07月(10)
2008年06月(20)
2008年05月(2)
2008年04月(1)
2008年03月(18)
2008年02月(6)
2008年01月(7)
2007年11月(18)
2007年10月(60)
2007年09月(32)
2007年08月(11)
2007年07月(4)
2007年06月(3)
2007年05月(4)
2007年04月(6)
2004年11月(1)
2004年10月(1)
软件项目交易
订阅我的博客
C#强化系列文章七:序列化和反序列化
收藏
新一篇: C#强化系列文章一:ViewState使用兼谈序列化
|
旧一篇: 兼容IE/FF的手动触发事件的函数
序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
我想最主要的作用有:
1、在进程下次启动时读取上次保存的对象的信息
2、在不同的AppDomain或进程之间传递数据
3、在分布式应用系统中传递数据
......
在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化
本文就通过一个小例子主要说说这三种方法的具体使用和异同点
这个例子就是使用三种不同的方式把一个Book对象进行序列化和反序列化,当然这个Book类首先是可以被序列化的。至于怎么使一个类可以序列化可以参见:
C#强化系列文章一:ViewState使用兼谈序列化
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等类型的字段不能进行序列化
发表于 @
2008年03月19日 08:20:00
|
评论(
loading...
)
|
编辑
新一篇: C#强化系列文章一:ViewState使用兼谈序列化
|
旧一篇: 兼容IE/FF的手动触发事件的函数
评论
#
jeckbjy 发表于2008-07-09 21:50:06 IP: 124.114.126.*
讲得太好了!
要是在讲一些实际应用就更完美了!
#
pclsprest 发表于2008-08-02 16:13:10 IP: 218.9.14.*
帅哥,背景音乐不错.
能把歌名发我么?谢了
puchunlingsprest@163.com
发表评论
姓 名:
主 页:
校验码:
看不清,换一张
登录