(转+整理)C# BinaryFormatter进行序列化与反序列化
序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形式使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。
.NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。 可以使用[Serializable]属性将类标志为可序列化的。如果某个类的元素不想被序列化,1、可以使用[NonSerialized]属性来标志,2、可以使用[XmlIgnore]来标志。
序列化意思指的是把对象的当前状态进行持久化,一个对象的状态在面向对象的程序中是由属性表示的,所以序列化类的时候是从属性读取值以某种格式保存下来,而类的成员函数不会被序列化,.net存在几种默认提供的序列化,二进制序列化,xml和json序列化会序列化所有的实例共有属性。
BinaryFormatter以二进制格式序列化和反序列化对象。
BinaryFormatte序列化:将对象转化成二进制。
BinaryFormatte反序列化:将二进制转化为对象。
命名空间: System.Runtime.Serialization.Formatters;
两个常用的方法:
Deserialize(Stream):将指定的流反序列化成对象
Serialize(Stream, Object):将对象序列化到给定的流
两个常用的属性:
Serializable:表示可以被序列化
NonSerializable:屏蔽被序列化
例如:
using UnityEngine;
using System;
using System.Collections;
using System.IO;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable] // 表示该类可以被序列化
class Person
{
private string name;
[NonSerialized] // 表示下面这个age字段不进行序列化
private int age;
public string Name
{
get { return name;}
set { name = value;}
}
public int Age
{
get { return age;}
set { age = value;}
}
public Person() { }
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public void SayHi()
{
Debug.LogFormat ("我是{0}, 今年{1}岁", name, age);
}
}
public class BinarySerializer : MonoBehaviour {
string filePath = Directory.GetCurrentDirectory() + "/binaryFile.txt";
// Use this for initialization
void Start () {
List<Person> listPers = new List<Person> ();
Person per1 = new Person ("张三", 18);
Person per2 = new Person ("李四", 20);
listPers.Add (per1);
listPers.Add (per2);
SerializeMethod (listPers); // 序列化
DeserializeMethod(); // 反序列化
Debug.Log("Done ! ");
}
void DeserializeMethod() // 二进制反序列化
{
FileStream fs = new FileStream (filePath, FileMode.Open);
BinaryFormatter bf = new BinaryFormatter ();
List<Person> list = bf.Deserialize (fs) as List<Person>;
if (list != null)
{
for (int i = 0; i < list.Count; i++)
{
list [i].SayHi ();
}
}
fs.Close ();
}
void SerializeMethod(List<Person> listPers) // 二进制序列化
{
FileStream fs = new FileStream (filePath, FileMode.Create);
BinaryFormatter bf = new BinaryFormatter ();
bf.Serialize (fs, listPers);
fs.Close ();
}
// Update is called once per frame
void Update () {
}
}
序列化的文本打开后,内容如下所示:
NonSerialized作用:被标记的字段都赋成空
反序列化输出结果:
大家好,我是张三,今年0岁
大家好,我是李四,今年0岁
由此看出,未序列化的字段存储的值为空
文章转载自:https://blog.csdn.net/e295166319/article/details/52790131、https://blog.csdn.net/u013667895/article/details/78478458
(转+整理)C# BinaryFormatter进行序列化与反序列化的更多相关文章
- xstream实现对象的序列化和反序列化(Java)
概述 最新整理Java方面XML序列化和反序列化的常用工具类,找到了dom4j和xstream.dom4j相对小巧,很好的解读xml:但是对于对象的xml序列化和反序列化,我还是比较喜欢xsteam( ...
- c#中序列化和反序列化的理解
using System.IO;using System.Runtime.Serialization.Formatters.Binary; 序列化:对象转化为文件的过程(字节流) 反序列化:文件(字节 ...
- C# 类的序列化和反序列化
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创 ...
- .NET Core 对象到字节数组的序列化和反序列化
.NET Core中利用MemoryStream和BinaryFormatter可以实现对象到字节数组的序列化和反序列化: 定义ObjectSerializer类,实现对象到字节数组的序列化和反序列化 ...
- Web Service 通过BinaryFormatter序列化和反序列化泛型List
1.序列化和反序列化的扩展方法如下: using System; using System.Collections.Generic; using System.Linq; using System.T ...
- 序列化与反序列化 - BinaryFormatter二进制(.dat)、SoapFormatter(.soap)、XmlSerializer(.xml)
序列化的作用是什么?为什么要序列化? 1.在进程下次启动时读取上次保存的对象的信息. 2.在不同的应用程序域或进程之间传递数据. 3.在分布式应用程序中的各应用程序之间传输对象. 所为序列化,就是将对 ...
- 初识序列化和反序列化,使用BinaryFormatter类、ISerializable接口、XmlSerializer类进行序列化和反序列化
序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程.对象一旦被序列化,就可以把对象状态保存到硬盘的某个位置,甚至还可以通过网络发送给另外一台机器上运行的进程.本篇主要包括: ● 使用 ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- C#中怎样实现序列化和反序列化
我们想要将数据进行持久化的操作的话,也就是将数据写入到文件中,我们在C#中可以通过IO流来操作,同时也可以通过序列化来操作,本人是比较推荐使用序列化操作的 因为我们如果想要将一个对象持久化到文件中 如 ...
随机推荐
- 利用JQuery Mobile开发web app
什么是web app web app 是基于web的应用程序,是针对移动设备优化后的web站点,它具有 开发成本低——采用web开发技术,不需要考虑跨平台以及底层适配问题: 升级简单——不需要通知用户 ...
- 前端 --- 4 js
一.js 描述 JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言.后来出现了node.js,可以作为后端语言来开发项目, js是一个既能做前端又能做后端的语言 Java ...
- SpringBoot 使用Hikaricp连接池
1.添加pom.xml依赖 如果是SpringBoot2.0,那么默认的连接池就是Hikaricp,不需要配置 其他的,如果继承 <parent> <groupId>org.s ...
- HDU 4391 Paint The Wall(分块的区间维护)
题意:给出几个操作,把l-r赋值为z,询问l-r有几个z,其中z < INT_MAX 思路:因为z很大,所以很难直接用线段树去维护.这里可以使用分块来解决.我们可以让每个块用map去储存map[ ...
- SpringBoot2.0之整合Apollo
Spring Boot客户端对接阿波罗服务器端 核心源码都在这个压缩包里面 封装好了环境 运行shell脚本就ok了 下面进入到本地maven仓库: 远程仓库apollo的jar包 只能打包到本地或者 ...
- C# 截取 byte 字节 转字符串
byte[] byteArray = System.Text.Encoding.Default.GetBytes(content); Byte[] ThisByte = new Byte[1];Buf ...
- p3396 哈希冲突(暴力)
想了好久,没想到优秀的解法,结果是个暴力大吃一静.jpg 分类讨论,预处理\(p\le \sqrt{n}\) 的情况,其他直接暴力,复杂度\(O(n \sqrt{n} )\) #include < ...
- kubernetes 实战4_命令_Configure Pods and Containers
Configure Service Accounts for Pods A service account provides an identity for processes that run in ...
- Docker1之Container
Document An image is a lightweight, stand-alone, executable package that includes everything needed ...
- qt QRegExp使用(搬运工)
设置正则表达式. 类似下面的 QRegExp 这里的用法就是用来检测QString等字符串错误的,例如文件名里面最好就不出现<>|/\:等,所以可以如下定义QRegExp rx(" ...