.net framework的类库中提供了三个可以用于序列化和反序列化的类,分别为BinaryFormatter、SoapFormatter和XmlSerializer。

BinaryFormatter的命名空间为System.Runtime.Serialization.Formatters.Binary,位于程序集mscorlib.dll中。

SoapFormatter的命名空间为System.Runtime.Serialization.Formatters.Soap,位于程序集System.Runtime.Serialization.Formatters.Soap.dll中。必须引用System.Runtime.Serialization.Formatters.Soap.dll。

XmlSerializer的命名空间为System.Xml.Serialization,位于程序集System.Xml.dll中。

需要说明的是,反序列化的过程(从文件-->对象的过程),不是new出来新对象,然后对其进行赋值的。反序列化的时候,不是依据类代码对各个成员进行初步赋值,然后执行构造函数的过程。在反序列化的时候,既不会为成员初赋值,也不会执行构造函数,而是直接对没有标注为[NonSerialized]的字段赋给其保存在文件中的值,而对于标注为[NonSerialized]的字段,其结果仅仅是default(FiledType),此处的FieldType是指字段的类型(注:可以利用OnSerialized方法来事后修改字段的值)。

对象序列化是将对象转换为二进制数据(字节流),反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化

BinaryFormatter类有两个方法:

void Serialize(Stream stream, object pbj)

对象obj序列化到Stream中

object Deserialize(Stream stream)

将对象从stream中反序列化,返回值为反序列化得到的对象

对象序列化的一些注意事项

要序列化的类型必须标记为:[Serializable]

该类型的父类也必须标记为:[Serializable]

该类型中的所有成员的类型也必须标记为:[Serializable]

序列化只会对类中的字段序列化,(只能序列化一些状态信息)

类结构修改后之前序列化的内容尽量不要用了,否则可能会出错;

为什么要序列化?

保持对象的持久化,将一个复杂的对象转换流,方便我们的存储与信息交换

应用:ASP.net中进程外Session要求对象可序列化;

还有Xml序列化,应用开发中Json序列化已经代替了二进制序列化和Xml序列化等

面试题:类可序列化的条件是?

答:这个类必须标记为Serializable,如果这个类有父类,那父类也必须要编辑为Serialzable类型的,如果这类所有成员的也必须要编辑为Serializable。

具体例子如下:

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Runtime.Serialization.Formatters.Binary;

using System.Text;

using System.Threading.Tasks;

namespace BinForm

{

class Program

{

static void Main(string[] args)

{

BinaryFormatter nw = new BinaryFormatter();//初始化 BinaryFormatter 类

person per = new person();//声明一个序列化的类

per.Name = "henry";

per.Age = 100;

using (FileStream oo = File.OpenWrite(@"D:\技术调研DEMO\DEMOTEST\File\1.data")) //打开写入文件流

{

nw.Serialize(oo, per);//把对象序列化到文件流中

}

}

}

[Serializable]

public class person

{

public string Name { get; set; }

public int Age { get; set; }

}

}

更多技术请关注

第十六篇 .NET高级技术之序列化的更多相关文章

  1. 第十九篇 .NET高级技术之C#中的线程(一)

    原文://http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 文章系参考转载,英文原文网址请参考:http://www.al ...

  2. 第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解

    1.FluentApi简介 在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货. 第一步在数据库创建一个表:person 第二步:新建控制台程序FluentAPI 第三 ...

  3. 第十五篇 .NET高级技术之正则表达式

    正则表达式 正则表达式是对字符串进行匹配的语法,像name like '%李%'一样,定义了一些特殊的“元字符”,用来判断一个字符串是否满足某个规则.正则表达式非常深,编译器都是基于正则表达式,掌握基 ...

  4. 第十四篇 .NET高级技术之反射

    两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时 ...

  5. 第十二篇 .NET高级技术之lambda表达式

    最近由于项目需要,刚刚学完了Action委托和Func<T>委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利.才能使代码更加简介 ...

  6. 第六篇 .NET高级技术之拆箱装箱

    拆箱.装箱 值类型赋值给Object类型变量的时候,会发生装箱:包装成Object.ValueType不也是继承自Object吗(CLR内部处理): Object类型变量赋值给值类型赋值的时候会发生拆 ...

  7. 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)

    解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...

  8. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  9. 跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint

    目录 SpringCloud系列教程 | 第十六篇:微服务利剑之APM平台(二)Pinpoint 1. Pinpoint概述 2. Pinpoint主要特性 3. Pinpoint优势 4. Pinp ...

随机推荐

  1. TCP socket心跳包示例程序

    在做游戏开发时,经常需要在应用层实现自己的心跳机制,即定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性. 在TCP socket心跳机制中,心跳包可以由服务器发送给客户端 ...

  2. Access 执行查询时,抛出“标准表达式中数据类型不匹配”的错误

    Access根据时间查询时应在查询条件前后加# SELECT COUNT(*) FROM [User] WHERE [CreateTime] > #{0}#

  3. Material Design (四),AppBarLayout的使用

    前言  AppBarLayout,顾名知意.就是用来给AppBar布局的容器,是LinearLayout的子类.而AppBar就包括我们通常所知道的ActionBar,Toolbar. AppBarL ...

  4. 光流(optical flow)和openCV中实现

    转载请注明出处! ! ! http://blog.csdn.net/zhonghuan1992 光流(optical flow)和openCV中实现 光流的概念:        是Gibson在195 ...

  5. LeetCode——Binary Tree Level Order Traversal

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  6. 解决asp.net mvc UpdateModel更新对象后出现null问题的方法

    在用asp.net mvc 4.0做项目的时候遇到的这种情况:情况分析:“在填写表单的时候,有一些表单没有填写,留空,然后直接post 提交表单,action中用UpdateModel 来更新mode ...

  7. reviews of learn python3 the hard way

    Almost every time,I try my best to write a long review of the book I have read. But this time I want ...

  8. 两篇C++和VC++字符串的文章

    有空挨个摘录写点心得 http://www.cnblogs.com/maowang1991/p/3572304.html http://www.cnblogs.com/maowang1991/p/35 ...

  9. httpd2.4.27rpm包制作

    http2.4.27 rpm包制作1.安装rpm-buildyum -y install rpm-build2.使用普通用户创建spec规则文件su - lxhvim httpd.spec Name: ...

  10. 计算机学院大学生程序设计竞赛(2015’12)Study Words

    Study Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...