转载 C# 序列化与反序列化意义详解
C# 序列化与反序列化意义详解
总结:
①序列化基本是指把一个对象保存到文件或流中,比如可以把文件序列化以保存到Xml中,或一个磁盘文件中
②序列化以某种存储形式使自定义对象持久化;
③将对象从一个地方传递到另一个地方。
④将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。
⑥序列是指将对象的实例状态存储到存储媒体的过程。
在此过程中,先将对象的公共字段以及类的名称(包括类的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
⑦用处非常大,用于数据传输,对象存贮等。
这些是我通过网上多方参考再结合自己的经验总结的。还是看实例。
【实例1】:
using System;
using System.IO; //文件操作相关
using System.Runtime.Serialization.Formatters.Binary; //包含 BinaryFormatter 类,该类可用于以二进制格式将对象序列化和反序列化。
namespace SerializeDeserialize
{
class Program
{
static void Main(string[] args)
{
Program P = new Program();
P.SerializeStudent();
P.DeSerializeStudent();
}
public void SerializeStudent()
{
Student c = new Student();
c.Id = 0;
c.Name = "小江";
c.Sex = "女";
c.Qq = "676596050";
c.Homepage = "http://hi.baidu.com/jiang_yy_jiang";
//创建二进制文件temp.dat
FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Create);
BinaryFormatter b = new BinaryFormatter();
//将Student实例对象序列化给fileStream流:其含义是这时候的Student对象已经存储到temp.dat 文件中
b.Serialize(fileStream, c);
fileStream.Flush();
fileStream.Close();
fileStream.Dispose();
}
public void DeSerializeStudent()
{
Student c = new Student();
//下面三个属性输出时没有更改,因为反序列化实例化了一个新的Student
c.Id = 1;
c.Qq = "676596051";
c.Homepage = "http://www.baidu.com/jiang_yy_jiang";
FileStream fileStream = new FileStream("c:\\temp.dat", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryFormatter b = new BinaryFormatter();
//将temp.dat 的文件流反序列化为Student
c = b.Deserialize(fileStream) as Student;
c.Name = "江正";
c.Sex = "男";
Console.Write("编号:" + c.Id + "\n姓名:" + c.Name + "\n性别:" + c.Sex + "\nQQ:" + c.Qq + "\n主页:" + c.Homepage);
Console.ReadLine();
//释放文件流资源
fileStream.Flush();
fileStream.Close();
fileStream.Dispose();
}
/// <summary>
/// 创建6个可读可写的属性
/// </summary>
[Serializable]
public class Student
{
//编号
private int id;
//姓名
private string name;
//性别
private string sex;
//QQ
private string qq;
//主页
private string homepage;
public int Id
{
get { return id; }
set { id = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
public string Sex
{
get { return sex; }
set { sex = value; }
}
public string Qq
{
get { return qq; }
set { qq = value; }
}
public string Homepage
{
get { return homepage; }
set { homepage = value; }
}
}
}
}
上面的序列化会将Student类实例存储到temp.dat 文件中,相反的反序列化就会实现将temp.dat中的数据反向生成Student对象
方便理解,其中在本实例中C:\temp.dat内容是:
KSerializeDeserialize, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null $SerializeDeserialize.Program+Student id name sex qq 灏忔睙 濂? 676596050
可以看出已经转换为了二进制编码。
效果是:

【实例2】:
using System;
using System.Collections; //HashTable 所在的命名空间
using System.IO; //FileStream所在的命名空间
using System.Runtime.Serialization.Formatters.Binary; //序列化反序列化进制转换空间
namespace Same1
{
class Program
{
static void Main(string[] args)
{
Serialize();
Deserialize();
Console.ReadLine();
}
static void Serialize()
{
//创建一个包含值的HashTable最后将被序列化
Hashtable addresses = new Hashtable();
addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");
addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");
addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");
//为了将HashTable序列化,需要创建一个File Stream
FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
// 利用二进制格式化将 Hashtable序列化至文件流中
BinaryFormatter formatter = new BinaryFormatter();
try
{
formatter.Serialize(fs, addresses);
}
catch (System.Runtime.Serialization.SerializationException e)
{
Console.WriteLine("序列化失败原因是: " + e.Message);
throw;
}
finally
{
fs.Flush();
fs.Close();
fs.Dispose();
}
}
static void Deserialize()
{
// 声明一个HashTable
Hashtable addresses = null;
// 打开你需要反序列化的文件,并以流的形式输出
FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
try
{
BinaryFormatter formatter = new BinaryFormatter();
//反序列化文件流为HashTable
addresses = (Hashtable)formatter.Deserialize(fs);
}
catch (System.Runtime.Serialization.SerializationException e)
{
Console.WriteLine("反序列化失败,原因是: " + e.Message);
throw;
}
finally
{
fs.Flush();
fs.Close();
fs.Dispose();
}
//为了验证反序列化是否成功,将HashTale中的键、值对输出
foreach (DictionaryEntry de in addresses)
{
Console.WriteLine("{0} 的出生地是: {1}.", de.Key, de.Value);
}
}
}
}
DateFile.dat 内容是:
System.Collections.Hashtable
LoadFactor Version Comparer HashCodeProvider HashSize Keys Values System.Collections.IComparer$System.Collections.IHashCodeProvider 霶8?
Mary Jeff Fred "PO Box 112233, Palo Alto, CA 94301 "123 Main Street, Redmond, WA 98052 987 Pine Road, Phila., PA 19116
效果如下:

转载 C# 序列化与反序列化意义详解的更多相关文章
- Java反序列化漏洞详解
Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具.本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进 ...
- 【META http-equiv="Content-Type" Content="text/html; Charset=*】意义详解
[META http-equiv="Content-Type" Content="text/html; Charset=*]意义详解 META,网页Html语言里Head ...
- [转载]Java序列化与反序列化
[转载]Java序列化与反序列化 来源: https://www.cnblogs.com/anitinaj/p/9253921.html 序列化和反序列化作为Java里一个较为基础的知识点,那你能说一 ...
- 【转载】html中object标签详解
[转载自http://blog.csdn.net/soliy/archive/2010/03/22/5404183.aspx] html标签之Object标签详解 作者:网络 出处:网络 ...
- 【转载】KMP入门级别算法详解--终于解决了(next数组详解)
[转载]https://blog.csdn.net/LEE18254290736/article/details/77278769 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达O ...
- 转载 LayoutInflater的inflate函数用法详解
http://www.open-open.com/lib/view/open1328837587484.html LayoutInflater的inflate函数用法详解 LayoutInflater ...
- 【转载】 Eclipse注释模板设置详解
Eclipse注释模板设置详解 网站推荐: 金丝燕网(主要内容是 Java 相关) 木秀林网(主要内容是消息队列)
- 【转载整理】mysql权限分配详解
原文:https://www.cnblogs.com/Csir/p/7889953.html MySQL权限级别 1)全局性的管理权限,作用于整个MySQL实例级别 2)数据库级别的权限,作用于某个指 ...
- [转载]springmvc学习之@ModelAttribute运用详解
spring学习之@ModelAttribute运用详解 链接
随机推荐
- 论山寨手机与Android 【13】SmartPhone AP系统
在第9章中我们提到,从功能上讲对于智能手机的一个粗略的概括是,智能手机 == 电脑 + 移动网卡,或者更准确地说,智能手机的硬件结构分为应用程序处理器AP,和基带处理器BP两个部分.这里隐含着两个问题 ...
- Delphi下创建异形窗体
procedure TForm1.FormCreate(Sender: TObject);var pt: array [0 .. 4] of TPoint; m_rgn: HRGN;begin ...
- 取PE文件的引入表和导出表
直接上代码(这里列出C++和Delphi的代码),Delphi代码中包含导入及导出文件和函数列表,PE结构可参阅资料,很多很详细,需要注意的是,本例中是映射到内存,不是通过PE装载器装入的,所以对于节 ...
- poj1423---求一个大数的位数方法,我猜网站上统计输入字符少于多少位的那个算法
法一:对一个数求它的对数,+1取整为其位数 问题转化为int (log10(N!)+1),对数性质log10(N!)=log10(N)+log10(N-1)+...+log10(1) /*用log10 ...
- 求解printf函数?
求大神解释一下下面的代码为什么答案不是1 2,而是1 0. #include <stdio.h> int ans = 0; int a() { ans = 1; return ans++; ...
- ubuntu系统下设置静态IP
改动 /etc/network/interfaces文件 加入下面内容 # The loopback network interface auto lo eth0 iface lo inet loop ...
- Android学习之SQLite学习
花了2天时间,系统学习了下Android开发过程中使用的轻量级数据库SQLite的使用. 并掌握其增,删,该,查的基本数据库操作. 首先要使用SQLite数据库,须要通过Android系统提供的SQL ...
- 10个Laravel4开发者必用扩展包
Laravel是一个新的基于最新PHP版本号语法,支持IoC等设计模式的高速开发框架.眼下最新版本号为4.2,推荐安装PHP版本号5.5+. 本文列举10个基本软件包,都是开发人员使用Laravel框 ...
- SQL整理4
--====================简单增删改===========--查看学生表的全部数据select * from studio --插入一个新的学生信息insert into stu ...
- XCode常用快捷键(转)
刚开始用Xcode是不是发现以前熟悉的开发环境的快捷键都不能用了?怎么快捷运行,停止,编辑等等.都不一样了.快速的掌握这些快捷键,能提供开发的效率. 其实快捷键在Xcode的工具栏里都标注有,只是有的 ...