注:原书上翻译为串行化,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;

[Serializable]
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对象:

class SerializeApp
{
    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" />

        ArrayList box = new ArrayList();
        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进行序列化相关推荐

  1. Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)

    文章目录 1.事务概述 2.事务特性 3.事务隔离级别 4.演示事务 4.1.演示读未提交 4.2.演示读已提交 4.3.演示可重复读 4.4.演示串行化读 1.事务概述 什么是事务? 一个事务是一个 ...

  2. 【转载】TreeView序列化,TreeView串行化,TreeView反序列化 c# winform

    转载自http://www.yongfa365.com/Item/WinForm-TreeView-SerializeTree.html 2009年给公司做了个管理系统,里面用到了TreeView,数 ...

  3. php 串行化数据,PHP中的串行化变量和序列化对象

    串行化大概就是把一些变量转化成为字符串的字节流的形式,这样比较容易传输.存储.当然,关是传输存储没有什么,关键是变成串的形式以后还能够转化回来,而且能够保持原来数据的结构. 在PHP中有多串行化处理的 ...

  4. php 串行化数据,php中对象的串行化

    我们大家有知道PHP串行化可以把变量包括对象,转化成连续bytes数据,你可以将串行化后的变量存在一个文件里或在网络上传输,然后再反串行化还原为原来的数据.文章这里就PHP串行化为大家详细的介绍.你在 ...

  5. Java-理论知识之串行化

    对对象进行串行化的方法有两种 : 1 Serializable接口  2 Externalizable接口 (安卓的对象串行化还可以使用Parcelable接口,方法与Serializable接口类似 ...

  6. Visual C++ 时尚编程百例019(串行化)

    串行化 串行化的基本思想是一个类对象,能够将它记录在成员变量中的当前状态存储, 也可以通过串行化的读取恢复操作重新创建对象. 使一个类可串行化,在类声明中使用DECLARE_DYNCREATE(CMy ...

  7. 在asp.net2.0中使用串行化对象实现自定义配置

    在一次升级一个entlib1.0到entlib的高版本程序时,碰到entlib的一个通过XmlSerializer方式实现的自定义配置.而在entlib的高版本中这样的配置不再被支持.可是又不希望修改 ...

  8. VC++ 串行化编程实例

    Win10 + VC6: 首先新建一个单文档工程,名为ardemo1: 增加写文件.读文件菜单:菜单ID自动生成:自己改也可以: 在 写文件 菜单,右击,选择 建立类向导: 在类向导中,类名选中Vie ...

  9. MySQL事务的可串行化

    可串行化--SERIALIZABLE 事务的最高级别,在每个读的数据行上,加上锁,使之不可能相互冲突,因此,会导致大量的超时现象 设置b账户,事务的隔离级别 B账户,首先,将b账户的隔离级别设置为SE ...

最新文章

  1. LeetCode 37. Sudoku Solver--数独求解(回溯法)--Java 3ms,Python 80ms 解法
  2. Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences
  3. 【笔记】spring的注解回顾,springboot-restful项目结构介绍 springboot-freemarker ⼯程配置详解
  4. GDCM:读取两个DICOM文件保存在另外dicom文件中的测试程序
  5. Magicodes.SwaggerUI 已支持.NET Core 3.1
  6. clover 主题_Clover主题更换
  7. 前端Ajax/JS/HTML+后端SpringMVC(二)
  8. virtual.lab motion用表达式控制载荷
  9. 从mysql数据库读取Blob_读取数据库Blob类型的文本数据
  10. mysql order by 固定_MySQL 强制操作以及order by 使用
  11. Web前端实现锁屏/解锁功能
  12. FPGA设计中遇到的奇葩问题之“芯片也要看出身”(二)
  13. 解决sqliteman创建失败的一种方法
  14. sqlserver2000安装时提示挂起并重启
  15. C语言日期计算器vs2022
  16. discuz php单页,Discuz! X2 自定义单页面最简单方法
  17. 一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
  18. 【ICLR 2023】Diffusion Models扩散模型和Prompt Learning提示学习:prompt-to-prompt
  19. 程序员小说 Out Of Memory (三)
  20. PHP在UTF8下生成的.csv在excel中乱码问题解决

热门文章

  1. linux安装到内存中,Linux安装识别大内存的补丁程序
  2. python redis模块常用_Python基础-redis模块使用
  3. hue是不是集成了oozie_在hue里面集成spark2,使用oozie的调度
  4. Kubernetes 证书过期
  5. 2012年美国计算机研究生排名,2012年美国研究生留学 计算机专业院校排名TOP50
  6. 52linux crond入门53crond时间规则54应用实例
  7. 3-34Pytorch与nn库
  8. python文件传输模块_[宜配屋]听图阁 - python 使用poster模块进行http方式的文件传输到服务器的方法...
  9. java db 使用_JavaDB的基本使用
  10. oracle mysql 线程数_oracle线程数更改