Mcad学习笔记之序列化(2进制和Soap序列化)
- Sql Server2005 Transact-SQL 新兵器学习总结之-总结
- Flex,Fms3相关文章索引
- FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8>
2
3namespace SerializTest
4{
5 [Serializable]
6 public class Class2
7 {
8 private string name;
9 [NonSerialized]
10 private int account;
11
12 public Class2(string name,int account)
13 {
14 this.account=account;
15 this.name=name;
16 }
17
18 public int Account
19 {
20 get
21 {
22 return account;
23 }
24 }
25
26 public string Name
27 {
28 get
29 {
30 return name;
31 }
32 }
33 }
34}
35
说明:
序列化一个类的最简单的方式是使用Serializable属性
当然还可以通过在对象上实现ISerializable接口,自定义序列化
标记了Serializable属性的类,类里面的所有成员都将被序列化,私有的变量也在内
当然我们也可以有选择的序列化类里面的字段
例如类里面的一些敏感数据,我们可以不对其进行序列化
通过用NonSerialized属性标记成员变量,可以防止它们被序列化
NonSerialized属性只可以用在类的某个字段上
好了,再来一段俺喜欢的控制台来看看到底是怎么回事
2using System.IO;
3using System.Runtime.Serialization;
4using System.Runtime.Serialization.Formatters.Binary;
5using System.Runtime.Serialization.Formatters.Soap;
6
7namespace SerializTest
8{
9 class Class1
10 {
11 [STAThread]
12 static void Main(string[] args)
13 {
14 string fileName="MyFile.dat";
15 Class2 my=new Class2("Serializ TestSerializ",987);
16 Console.WriteLine("初始化Class2类的一个实例my,my的账号=987,my的名字=Serializ TestSerializ");
17
18 //序列化过程开始,我们把Class2的实例二进制序列化到文件MyFile.dat中
19 IFormatter formatter1=new BinaryFormatter();
20 Stream stream1 = new FileStream(fileName, FileMode.Create, FileAccess.Write,FileShare.None);
21 formatter1.Serialize(stream1,my);
22 stream1 .Close();
23
24 //反序列化过程开始,我们把Class2的实例从文件MyFile.dat中取出来
25 IFormatter formatter = new BinaryFormatter();
26 Stream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
27 Class2 c2 = (Class2) formatter.Deserialize(stream);
28 stream.Close();
29
30 Console.WriteLine("c2的名字="+ c2.Name );
31 Console.WriteLine("c2的账号="+ c2.Account.ToString() );
32
33 Console.ReadLine();
34 }
35 }
36}
结果是
我们可以看到由于类Class2的account字段运用了NonSerialized属性
反序列化后我们是看不到Class2类实例的账号,只能看到名字
让我们再看一段,同时序列化多个对象的代码
2using System.IO;
3using System.Runtime.Serialization;
4using System.Runtime.Serialization.Formatters.Binary;
5using System.Runtime.Serialization.Formatters.Soap;
6
7namespace SerializTest
8{
9 class Class1
10 {
11 [STAThread]
12 static void Main(string[] args)
13 {
14 string fileName="MyFile.dat";
15 Class2[] myClass={new Class2("a",123),new Class2("b",456),new Class2("c",789)};
16
17 //序列化过程开始
18 //我们把类的几个实例序列化到一个文件中,这样比起分别序列化可以节约空间
19 IFormatter formatter=new BinaryFormatter();
20 Stream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write,FileShare.None);
21 for(int i=0;i<myClass.Length;i++)
22 {
23 formatter.Serialize(stream,myClass[i]);
24 }
25 stream.Close();
26
27 //反序列化过程开始
28 IFormatter formatter11=new BinaryFormatter();
29 Stream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read,FileShare.Read);
30 long ii= fs.Length;
31 System.Collections.ArrayList list=new System.Collections.ArrayList();
32 //从文件中逐个读出Class2的实例并反序列化
33 while (fs.Position!=fs.Length)
34 {
35 list.Add(formatter11.Deserialize(fs));
36 }
37 fs.Close();
38 Console.WriteLine("反序列化结果:");
39 foreach(object o in list)
40 {
41 Class2 class2=o as Class2;
42 if (class2!=null)
43 {
44 Console.WriteLine("名字="+ class2.Name );
45 Console.WriteLine("账号="+ class2.Account.ToString());
46 }
47 }
48
49 Console.ReadLine();
50 }
51 }
52}
结果是
其实数组也是可以序列化的类
那么我们可以把上面的代码做些简化
2using System.IO;
3using System.Runtime.Serialization;
4using System.Runtime.Serialization.Formatters.Binary;
5using System.Runtime.Serialization.Formatters.Soap;
6
7namespace SerializTest
8{
9 class Class1
10 {
11 [STAThread]
12 static void Main(string[] args)
13 {
14 string fileName="MyFile.dat";
15 Class2[] myClass={new Class2("a",123),new Class2("b",456),new Class2("c",789)};
16
17 //序列化过程开始
18 IFormatter formatter=new BinaryFormatter();
19 Stream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write,FileShare.None);
20 formatter.Serialize(stream,myClass);
21 stream.Close();
22
23 //反序列化过程开始
24 IFormatter formatter11=new BinaryFormatter();
25 Stream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read,FileShare.Read);
26 Class2[] list=(Class2[])formatter11.Deserialize(fs);
27 fs.Close();
28 Console.WriteLine("反序列化结果:");
29 foreach(Class2 o in list)
30 {
31 Console.WriteLine("名字="+ o.Name );
32 Console.WriteLine("账号="+ o.Account.ToString());
33 }
34
35 Console.ReadLine();
36 }
37 }
38}
代码简化了不少,功能是一样的
小总结:
我上面的代码全部是利用了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书签 添加到百度搜藏 添加到雅虎收藏
欢迎您的加入
转载于:https://www.cnblogs.com/aierong/archive/2005/05/29/164501.html
Mcad学习笔记之序列化(2进制和Soap序列化)相关推荐
- 嵌入式系统设计师学习笔记①:数的进制转换
嵌入式系统设计师学习笔记:数的转换 进位计数制系统的基本概念:数制,基数,数码,数位,位权 制作了个表格如下: 在十六进制中:A-10,B-11,C-12,D-13,E-14,F-15. 举例各种进制 ...
- java进制转化_【Java学习笔记之四】java进制转化
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- 【Java学习笔记之四】java进制转化
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- Mcad学习笔记之委托再理解(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)...
相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...
- Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)
相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...
- Mcad学习笔记之Microsoft Windows服务
相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...
- 16进制加法 keil_C/C++编程笔记:C语言进制详解,二进制、八进制和十六进制
我们平时使用的数字都是由 0~9 共十个数字组成的,例如 1.9.10.297.952 等,一个数字最多能表示九,如果要表示十.十一.二十九.一百等,就需要多个数字组合起来. 例如表示 5+8 的结果 ...
- 计算机编码二进制0001,二进制学习01(二进制,进制运算,数据宽度,无符号位有符号位编码规则)...
二进制学习01 进制 一.二进制简介 1)什么是二进制? 2)二进制的简写形式 二.进制运算 1)八进制运算表 (1) 加法运算表 (2)乘法运算表 (3)八进制简单运算题 三.数据宽度 1)什么是数 ...
- linux shell 删除key \xAC\xED\x00\x05t\x00\x04${key} 序列化16进制
背景就是 要查询一批键值对进行删除 通过keys key∗匹配出来要删除的key然后通过del命令删除想着用shell直接把查询出来键{key}* 匹配出来要删除的key 然后通过del命令删除 想着 ...
最新文章
- php过滤非法字符函数,利用php怎么对非法字符进行过滤
- 成本速度定成败 四种宽带接入技术大比拼(1)
- webpack安装和配置
- Struts 2.5.20 在Eclipse配置
- css3之border-image
- 一个简单的你好,世界! 使用 Boost.MPI 消息传递的示例
- APPium-Xpath,swipe练习
- NB-IoT 连接数过亿,开发者如何抓住新机遇?
- python函数的参数细节
- CTO 要我把这份 MySQL 规范贴在工位上!
- 控制总线上发送的控制信息
- LayaAir destroy 销毁与 removeChild 移除节点
- Deepin在matlab的安装
- 计算机专业必须考过英语4级吗,计算机专业英语必须过六级吗
- 计算机与食品科学与工程关系,计算机在食品科学与工程中的应用课程标准.doc...
- 计算机软件如何永久删除,【电脑软件教程篇】如何永久彻底清除电脑使用痕迹...
- 剑芒罗曼史2解图片程序
- 搭建企业级微信公众号管理平台(三)----注册码实现与校验,Redis存储
- 刚开始学Python
- jquery 即点即改.......
热门文章
- python数字排序分组代码_python pandas 组内排序、单组排序、标号的实例
- 哪一类功率放大电路效率最高_电路分析基础(8)-最大功率传输与阻抗匹配分析...
- ios 圆形旋转菜单_iOS高级动画:圆形树展开收起动画
- python随机抽号_随手小代码——Python 从集合中随机抽取元素
- Java IO在Android中应用(三):Apk加固去壳
- 开发日记-20190530 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
- lucene .doc文件格式解析——见图
- Centos7.0一键搭建Python3.6开发环境
- 洛谷P2219 [HAOI2007]修筑绿化带(单调队列)
- php定界符EOF讲解