原文链接:https://blog.csdn.net/e295166319/article/details/52790131

序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。

.NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。    可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。

序列化意思指的是把对象的当前状态进行持久化,一个对象的状态在面向对象的程序中是由属性表示的,所以序列化类的时候是从属性读取值以某种格式保存下来,而类的成员函数不会被序列化,.net存在几种默认提供的序列化,二进制序列化,xml和json序列化会序列化所有的实例共有属性。

  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.IO;
  5. using System.Collections.Generic;
  6. using System.Runtime.Serialization.Formatters.Binary;
  7. [Serializable] // 表示该类可以被序列化
  8. class Person
  9. {
  10. private string name;
  11. [NonSerialized] // 表示下面这个age字段不进行序列化
  12. private int age;
  13. public string Name
  14. {
  15. get { return name;}
  16. set { name = value;}
  17. }
  18. public int Age
  19. {
  20. get { return age;}
  21. set { age = value;}
  22. }
  23. public Person() { }
  24. public Person(string name, int age)
  25. {
  26. this.name = name;
  27. this.age = age;
  28. }
  29. public void SayHi()
  30. {
  31. Debug.LogFormat ("我是{0}, 今年{1}岁", name, age);
  32. }
  33. }
  34. public class BinarySerializer : MonoBehaviour {
  35. string filePath = Directory.GetCurrentDirectory() + "/binaryFile.txt";
  36. // Use this for initialization
  37. void Start () {
  38. List<Person> listPers = new List<Person> ();
  39. Person per1 = new Person ("张三", 18);
  40. Person per2 = new Person ("李四", 20);
  41. listPers.Add (per1);
  42. listPers.Add (per2);
  43. SerializeMethod (listPers); // 序列化
  44. DeserializeMethod(); // 反序列化
  45. Debug.Log("Done ! ");
  46. }
  47. void DeserializeMethod() // 二进制反序列化
  48. {
  49. FileStream fs = new FileStream (filePath, FileMode.Open);
  50. BinaryFormatter bf = new BinaryFormatter ();
  51. List<Person> list = bf.Deserialize (fs) as List<Person>;
  52. if (list != null)
  53. {
  54. for (int i = 0; i < list.Count; i++)
  55. {
  56. list [i].SayHi ();
  57. }
  58. }
  59. fs.Close ();
  60. }
  61. void SerializeMethod(List<Person> listPers) // 二进制序列化
  62. {
  63. FileStream fs = new FileStream (filePath, FileMode.Create);
  64. BinaryFormatter bf = new BinaryFormatter ();
  65. bf.Serialize (fs, listPers);
  66. fs.Close ();
  67. }
  68. // Update is called once per frame
  69. void Update () {
  70. }
  71. }

序列化的文本打开后,内容如下所示:

反序列化输出结果:

大家好,我是张三,今年0岁

大家好,我是李四,今年0岁

由此看出,未序列化的字段存储的值为空

关于XmlSerializer进行序列化与反序列化的操作将在下篇文章进行介绍……

C# 二进制BinaryFormatter进行序列化与反序列化相关推荐

  1. C#二进制流的序列化和反序列化操作

    C#项目中较多使用了序列化和反序列化,较为常用的序列化和反序列化操作有二进制流,JSON,XML等,现在介绍一下.net中二进制流的序列化和反序列化操作方法: 1.将对象序列化为二进制流: /// & ...

  2. C# 二进制读写与序列化和反序列化

    可参考雨松大神: http://www.xuanyusong.com/archives/1919 http://www.xuanyusong.com/archives/1901 文章将实现数据存储为二 ...

  3. C#序列化与反序列化以及深拷贝浅拷贝方法

    基于二进制数据流的序列化和反序列化 /// <summary>/// 序列化/// </summary>/// <typeparam name="T" ...

  4. C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化

    一.Path 1.GetFileName();   //获取文件名 2.GetFileNameWithoutExtention();   //获取不带扩展名的文件名称 3.GetExtension() ...

  5. Java之序列化和反序列化

    字符流和字节流,他们的操作对象是:字节(二进制),字符 序列化和反序列化的操作主体对象是:对象和二进制 什么是序列化和反序列化? 序列化:将对象转换成二进制 反序列化:从二进制中将二进制转换成对象(类 ...

  6. binaryformatter java_Java,C#使用二进制序列化、反序列化操作数据

    java使用二进制序列化.反序列化的操作首先,要引入java.io下面相关包,或者直接写import java.io.*; 下面,为了书写操作的方便,采用复制文件,和throws声明异常的方式来写 p ...

  7. C#: .net序列化及反序列化 [XmlElement(“节点名称”)] [XmlAttribute(“节点属性”)] (上篇)...

    .net序列化及反序列化 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了. 比如,一个计数器,数值为2,我们可以用字符串"2&q ...

  8. ASP.NET中序列化与反序列化-以显示上一次登录的信息为例

    场景 ASP.NET中新建Web网站并部署到IIS上(详细图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107199 ...

  9. 谈谈:.Net中的序列化和反序列化

    序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一 ...

最新文章

  1. 震惊!这样终止线程,竟然会导致服务宕机?
  2. python编程基础(四):编程习惯、代码规范、易混淆之处
  3. vue-cli3.0 Typescript 项目集成环信WebIM 群组聊天
  4. 《阿凡达》2020再度观看观后感
  5. 深信服云计算BU专家组组长王佳玮:全融合时代的企业云新架构
  6. spring事务传播,隔离级别,
  7. 用jdbc连接hive server需要用到的 几个jar包
  8. JDK18 Java 18 拥有 9 个新特性
  9. linux系统交叉编译如何打包,构建ARM Linux交叉编译器
  10. Mybatis 拦截器 说明和使用 (一)
  11. 如何清空c盘只剩系统_如何清除c盘除系统外所有垃圾
  12. centos7安装kylo0.10.1
  13. 2019互联网+直播平台开发如何发展?
  14. centos7安装源设置基础软件仓库时出错
  15. Spring【三】容器与Bean扩展点
  16. 支付宝扫码支付php demo
  17. 给想上MIT的牛学生说几句
  18. php zend optimizer 解密,zend guard对php代码加密 zend optimizer解析
  19. matlab初值的非线性最小二乘,Matlab与Mathematica在非线性拟合中的应用比较
  20. 社区社群运营,如何打造火爆营销的方法?

热门文章

  1. 一个简单的封ip规则
  2. Linux笔记1-5 --用户
  3. WAP端 touch事件触发顺序记录
  4. 知方可补不足~数据库名称和数据库别名不同了怎么办
  5. ppp和chap的区别
  6. win7普通家庭版硬盘分区
  7. 虚拟局域网(VLAN)的管理
  8. 程序员真的是吃青春饭的吗?(献给即将进入职场的程序员们)
  9. cad怎么向下位移_CAD制图初学入门教程:阵列功能的使用技巧
  10. 计算机机房管理具体工作和职责,机房管理