序列化(串行化)- 使用BinaryFormatter进行序列化
注:原书上翻译为串行化,MSDN翻译为序列化,我以MSDN为准,写为序列化。
可以使用属性(Attribute)将类的元素标为可序列化的(Serializable)和不可被序列化的(NonSerialized)。.NET中有两个类实现了IFormatter借口的类中的Serialize和Deserialize方法:BinaryFormatter和SoapFormatter。这两个类的区别在于数据流的格式不同。
使用BinaryFormatter进行序列化
在下面这个例子中我们建立一个自定义类型(Insect)集合,使用BinaryFormatter将它们写到二进制文件,然后再将他们读回。
注:以下程序需要导入一些命名空间:
using System;
using System.IO;
using System.Collections;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
public class Insect
{
private string name;
[NonSerialized]
private int id;
public Insect(string name, int id)
{
this.name = name;
this.id= id;
}
public override string ToString()
{
return String.Format("{0}:{1}", name, id);
}
}
我们使用一个标准属性将整个Insect类声明为可序列化的。但是因为一个字段被声明为不可序列化,所以这个字段不能被持久化。
我们先做一个试验,我们只实例化一个Insect对象,创建一个文件,然后使用BinaryFormatter对象和Serialize方法写出这个Insect对象:
{
public static void Main(string[] args)
{
Insect i = new Insect("Meadow Brown", 12);
Stream sw = File.Create("Insects.bin");
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(sw, i);
sw.Close();
}
}
如果在Visual Studio打开Insect.bin文件就会看到以下内容:
FBinaryFormatter, Version=<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0.0.0.0, Culture=neutral, PublicKeyToken=null Insect name Meadow Brown(由于我没有截图软件,所以这只是部分内容)
我们可以注意到并没有id字段,因为它没有被序列化。
现在,我们增加几个Insect对象。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
box.Add(new Insect("Marsh Fritillary", 34));
box.Add(new Insect("Speckled Wood", 56));
box.Add(new Insect("Milkweed", 78));
sw = File.Open("Insects.bin", FileMode.Append);
bf.Serialize(sw, box);
sw.Close();
Stream sr = File.OpenRead("Insects.bin");
Insect j = (Insect)bf.Deserialize(sr);
Console.WriteLine(j);
ArrayList bag = (ArrayList)bf.Deserialize(sr);
sr.Close();
foreach(Insect k in bag)
{
Console.WriteLine(k);
}
下面是这个程序的输出:
Meadow Brown:0
Marsh Fritillary:0
Speckled Wood:0
Milkweed:0
id值是0,其原因是很明显的(它在foreach循环中构造Insect的期间被初始化为0)。
注意,我们非常小心地先读回一个Insect对象 - 在读回集合之前已经被序列化到文件的对象。
另外,在我们使用Deserialize时,必须对返回的对象进行类型转换,因为这个方法返回一个一般性的对象。
在后面添加的集合中有三个Insect的数据,这节省了一些开销,因为只需要为第一列的Insect记录Insect类的类型信息。
另外一个有意思的地方是,序列化机制显然能够读写列中的私有字段。
转载于:https://www.cnblogs.com/wdxinren/archive/2004/10/20/54814.html
序列化(串行化)- 使用BinaryFormatter进行序列化相关推荐
- Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)
文章目录 1.事务概述 2.事务特性 3.事务隔离级别 4.演示事务 4.1.演示读未提交 4.2.演示读已提交 4.3.演示可重复读 4.4.演示串行化读 1.事务概述 什么是事务? 一个事务是一个 ...
- 【转载】TreeView序列化,TreeView串行化,TreeView反序列化 c# winform
转载自http://www.yongfa365.com/Item/WinForm-TreeView-SerializeTree.html 2009年给公司做了个管理系统,里面用到了TreeView,数 ...
- php 串行化数据,PHP中的串行化变量和序列化对象
串行化大概就是把一些变量转化成为字符串的字节流的形式,这样比较容易传输.存储.当然,关是传输存储没有什么,关键是变成串的形式以后还能够转化回来,而且能够保持原来数据的结构. 在PHP中有多串行化处理的 ...
- php 串行化数据,php中对象的串行化
我们大家有知道PHP串行化可以把变量包括对象,转化成连续bytes数据,你可以将串行化后的变量存在一个文件里或在网络上传输,然后再反串行化还原为原来的数据.文章这里就PHP串行化为大家详细的介绍.你在 ...
- Java-理论知识之串行化
对对象进行串行化的方法有两种 : 1 Serializable接口 2 Externalizable接口 (安卓的对象串行化还可以使用Parcelable接口,方法与Serializable接口类似 ...
- Visual C++ 时尚编程百例019(串行化)
串行化 串行化的基本思想是一个类对象,能够将它记录在成员变量中的当前状态存储, 也可以通过串行化的读取恢复操作重新创建对象. 使一个类可串行化,在类声明中使用DECLARE_DYNCREATE(CMy ...
- 在asp.net2.0中使用串行化对象实现自定义配置
在一次升级一个entlib1.0到entlib的高版本程序时,碰到entlib的一个通过XmlSerializer方式实现的自定义配置.而在entlib的高版本中这样的配置不再被支持.可是又不希望修改 ...
- VC++ 串行化编程实例
Win10 + VC6: 首先新建一个单文档工程,名为ardemo1: 增加写文件.读文件菜单:菜单ID自动生成:自己改也可以: 在 写文件 菜单,右击,选择 建立类向导: 在类向导中,类名选中Vie ...
- MySQL事务的可串行化
可串行化--SERIALIZABLE 事务的最高级别,在每个读的数据行上,加上锁,使之不可能相互冲突,因此,会导致大量的超时现象 设置b账户,事务的隔离级别 B账户,首先,将b账户的隔离级别设置为SE ...
最新文章
- LeetCode 37. Sudoku Solver--数独求解(回溯法)--Java 3ms,Python 80ms 解法
- Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences
- 【笔记】spring的注解回顾,springboot-restful项目结构介绍 springboot-freemarker ⼯程配置详解
- GDCM:读取两个DICOM文件保存在另外dicom文件中的测试程序
- Magicodes.SwaggerUI 已支持.NET Core 3.1
- clover 主题_Clover主题更换
- 前端Ajax/JS/HTML+后端SpringMVC(二)
- virtual.lab motion用表达式控制载荷
- 从mysql数据库读取Blob_读取数据库Blob类型的文本数据
- mysql order by 固定_MySQL 强制操作以及order by 使用
- Web前端实现锁屏/解锁功能
- FPGA设计中遇到的奇葩问题之“芯片也要看出身”(二)
- 解决sqliteman创建失败的一种方法
- sqlserver2000安装时提示挂起并重启
- C语言日期计算器vs2022
- discuz php单页,Discuz! X2 自定义单页面最简单方法
- 一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
- 【ICLR 2023】Diffusion Models扩散模型和Prompt Learning提示学习:prompt-to-prompt
- 程序员小说 Out Of Memory (三)
- PHP在UTF8下生成的.csv在excel中乱码问题解决
热门文章
- linux安装到内存中,Linux安装识别大内存的补丁程序
- python redis模块常用_Python基础-redis模块使用
- hue是不是集成了oozie_在hue里面集成spark2,使用oozie的调度
- Kubernetes 证书过期
- 2012年美国计算机研究生排名,2012年美国研究生留学 计算机专业院校排名TOP50
- 52linux crond入门53crond时间规则54应用实例
- 3-34Pytorch与nn库
- python文件传输模块_[宜配屋]听图阁 - python 使用poster模块进行http方式的文件传输到服务器的方法...
- java db 使用_JavaDB的基本使用
- oracle mysql 线程数_oracle线程数更改