相关文章导航
  1. Sql Server2005 Transact-SQL 新兵器学习总结之-总结
  2. Flex,Fms3相关文章索引
  3. FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8>
我最近学习remoting和web服务时,总是看到一个重要的字眼"序列化".
那什么是序列化呢?以前我也模模糊糊.
 
为了搞清楚,请和我一起来序列化学习之旅吧.
 
让我们先看看序列化的定义,以下是微软的说明:
序列化可被定义为将对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。在以后反序列化该对象时,创建原始对象的精确复本
 
序列化一般用在2种地方:
1.将数据保持到存储中
例如:我知道在Asp.Net Forums中有.Net中序列化和反序列化的应用
在Forums中,有些内容是不固定的,如用户资料,除了一些基本资料,可能还要MSN、个人主页、签名等.我们一般是一个属性对应于表中的一个字段,要是以后我们增加一些新属性,就得增加表字段,还要修改存储过程,这样其不麻烦?
在Asp.Net Forums中把用户资料序列化为2进制,这样用一个表字段就可以解决问题,并且扩展性好。
 
2.通过值将对象从一个应用程序域发送到另一个应用程序域中
remoting和web服务就是典型的应用
 
说多了没用,让我们来一段代码吧
先定义一个类
 1Mcad学习笔记之序列化(2进制和Soap序列化)using System;
 2Mcad学习笔记之序列化(2进制和Soap序列化)
 3Mcad学习笔记之序列化(2进制和Soap序列化)namespace SerializTest
 4
说明:
序列化一个类的最简单的方式是使用Serializable属性
当然还可以通过在对象上实现ISerializable接口,自定义序列化
标记了Serializable属性的类,类里面的所有成员都将被序列化,私有的变量也在内
当然我们也可以有选择的序列化类里面的字段
例如类里面的一些敏感数据,我们可以不对其进行序列化
通过用NonSerialized属性标记成员变量,可以防止它们被序列化
NonSerialized属性只可以用在类的某个字段上

好了,再来一段俺喜欢的控制台来看看到底是怎么回事
 1Mcad学习笔记之序列化(2进制和Soap序列化)using System;
 2Mcad学习笔记之序列化(2进制和Soap序列化)using System.IO;
 3Mcad学习笔记之序列化(2进制和Soap序列化)using System.Runtime.Serialization;
 4Mcad学习笔记之序列化(2进制和Soap序列化)using System.Runtime.Serialization.Formatters.Binary;
 5Mcad学习笔记之序列化(2进制和Soap序列化)using System.Runtime.Serialization.Formatters.Soap;
 6Mcad学习笔记之序列化(2进制和Soap序列化)
 7Mcad学习笔记之序列化(2进制和Soap序列化)namespace SerializTest
 8}
结果是
Mcad学习笔记之序列化(2进制和Soap序列化)
我们可以看到由于类Class2的account字段运用了NonSerialized属性
反序列化后我们是看不到Class2类实例的账号,只能看到名字

让我们再看一段,同时序列化多个对象的代码
 1Mcad学习笔记之序列化(2进制和Soap序列化)using System;
 2Mcad学习笔记之序列化(2进制和Soap序列化)using System.IO;
 3Mcad学习笔记之序列化(2进制和Soap序列化)using System.Runtime.Serialization;
 4Mcad学习笔记之序列化(2进制和Soap序列化)using System.Runtime.Serialization.Formatters.Binary;
 5Mcad学习笔记之序列化(2进制和Soap序列化)using System.Runtime.Serialization.Formatters.Soap;
 6Mcad学习笔记之序列化(2进制和Soap序列化)
 7Mcad学习笔记之序列化(2进制和Soap序列化)namespace SerializTest
 8}
结果是
Mcad学习笔记之序列化(2进制和Soap序列化)

其实数组也是可以序列化的类
那么我们可以把上面的代码做些简化
 1Mcad学习笔记之序列化(2进制和Soap序列化)using System;
 2Mcad学习笔记之序列化(2进制和Soap序列化)using System.IO;
 3Mcad学习笔记之序列化(2进制和Soap序列化)using System.Runtime.Serialization;
 4Mcad学习笔记之序列化(2进制和Soap序列化)using System.Runtime.Serialization.Formatters.Binary;
 5Mcad学习笔记之序列化(2进制和Soap序列化)using System.Runtime.Serialization.Formatters.Soap;
 6Mcad学习笔记之序列化(2进制和Soap序列化)
 7Mcad学习笔记之序列化(2进制和Soap序列化)namespace SerializTest
 8}

代码简化了不少,功能是一样的

小总结:
我上面的代码全部是利用了BinaryFormatter类来进行序列化
此类序列化对于在 .NET 平台上进行运用效果比较理想
要是考虑到程序的可移植性,我们可以考虑用类SoapFormatter替代
同样也是调用Serialize和Deserialize方法
因为这2个类都实行了接口IFormatter
特别注意的是,Serializable属性不能被继承.
由SerializableAttribute类的定义我们可以看出.
[AttributeUsage(AttributeTargets.Delegate | (AttributeTargets.Enum | (AttributeTargets.Struct | AttributeTargets.Class)), Inherited=false)]
public sealed class SerializableAttribute : Attribute
如果我们从Class2派生一个新类,此新类必须也用该属性标记,否则它不能被序列化.

希望上面提到的知识对你有所提示
当然欢迎交流和指正
 
收藏与分享

收藏到QQ书签 Mcad学习笔记之序列化(2进制和Soap序列化) 添加到百度搜藏 Mcad学习笔记之序列化(2进制和Soap序列化)添加到雅虎收藏 Mcad学习笔记之序列化(2进制和Soap序列化) Mcad学习笔记之序列化(2进制和Soap序列化) Mcad学习笔记之序列化(2进制和Soap序列化)

RSS订阅我 什么是RSS?

Mcad学习笔记之序列化(2进制和Soap序列化)   Mcad学习笔记之序列化(2进制和Soap序列化)   Mcad学习笔记之序列化(2进制和Soap序列化)
Mcad学习笔记之序列化(2进制和Soap序列化)   Mcad学习笔记之序列化(2进制和Soap序列化)   Mcad学习笔记之序列化(2进制和Soap序列化)   Mcad学习笔记之序列化(2进制和Soap序列化)
Mcad学习笔记之序列化(2进制和Soap序列化)   Mcad学习笔记之序列化(2进制和Soap序列化)   Mcad学习笔记之序列化(2进制和Soap序列化)
Mcad学习笔记之序列化(2进制和Soap序列化)   Mcad学习笔记之序列化(2进制和Soap序列化)   Mcad学习笔记之序列化(2进制和Soap序列化)

东莞.net俱乐部

Mcad学习笔记之序列化(2进制和Soap序列化) 欢迎您的加入

相关文章: