C# 二进制BinaryFormatter进行序列化与反序列化

Unity借助BinaryFormatter用二进制来储存游戏数据 BinaryFormatter是以二进制的形式序列化和反序列化 序列化:讲对象转化成二进制;反序列化:将二进制转化成对象 引用命名空间:System.Runtime.Serialization.Formatters.Binary 储存数据方法:Serialize(FileStream, Data):将指定的流 序列化 成对象 取出数据方法:Deserialize(FileStream):将指定的流... 阅读详情
AI摘要

本文介绍了.NET框架中的序列化概念,包括二进制序列化与XML序列化,并通过Unity示例展示了如何使用BinaryFormatter进行序列化与反序列化操作。

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

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

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

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 () {
	
	}
}


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


反序列化输出结果:

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

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

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


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

.net反序列化入门--BinaryFormatter BinaryFormatter反序列化还有许多攻击链,但大多都是在TextFormattingRunProperties链的基础上进行相应的封装。而TextFormattingRunProperties则是封装的XamlReader.Parse(),借助ObjectDataProvider的Xamlpayload可以实现代码执行。也就是说,我们在使用BinaryFormatter反序列化TextFormattingRunProperties封装的数据时,最终会落到XamlReader进行反序列化。 阅读详情

相关推荐

C#序列化和反序列化之一-二进制序列化

本系列文章主要介绍C#应用程序开发中常用的序列化和反序列化技术(不包含Web服务中的序列化,详见C#序列化与反序列化),包括以下两种方式: 二进制序列化XML序列化和反序列化            首先介绍二进制序列化,二进制序列化是使用BinaryFormatter 类的实例方法 Serialize(Stream, Object) 和 Deserialize(Stream)

EricJiang的技术专栏 7246

.net反序列化入门—BinaryFormatter

BinaryFormatter反序列化还有许多攻击链,但大多都是在TextFormattingRunProperties链的基础上进行相应的封装。而TextFormattingRunProperties则是封装的XamlReader.Parse(),借助ObjectDataProvider的Xamlpayload可以实现代码执行。也就是说,我们在使用BinaryFormatter反序列化TextFormattingRunProperties封装的数据时,最终会落到XamlReader进行反序列化。

阿道夫的博客 1323

Unity中的序列化和反序列化

序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象在Unity中保存和加载、prefab、scene、Inspector窗口、实例化预制体等都使用了序列化与反序列化。...

L的博客 7946

C#利用BinaryFormatter序列化对象的用法

C# 序列化与反序列化意义详解 总结: ①序列化基本是指把一个对象保存到文件或流中,比如可以把文件序列化以保存到Xml中,或一个磁盘文件中 ②序列化以某种存储形式使自定义对象持久化; ③将对象从一个地方传递到另一个地方。 ④将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。 ⑥序列是指将对象的实例状态存储到存储媒体的过程。 在此过程中,先将对象...

awangdea99的博客 1万+

C#【必备技能篇】序列化与反序列化(json、xml、二进制文件)

C#【必备技能篇】序列化与反序列化(json、xml、二进制文件)

星Yeah 的博客 4327

【计算摄影】相机成像原理:从光到JPEG图像

本文我们将从最基本的相机成像原理开始论述,再讨论光线进入相机后,经过一系列处理成为JPEG图像的大致流程。

qq_35149975的博客 2万+

C# 二进制序列化与反序列化(BinaryFormatter)全套笔记

将对象 / 集合对象 转换成二进制数据格式,写入本地文件实现持久化存储。通俗理解:对象转二进制,存硬盘。

2401_84677775的博客 524

手把手调试AD9653的LVDS数据采集:从VIO抓波形到用F0/F8帧对齐的实战心得

本文详细介绍了AD9653高速ADC与Xilinx 7系列FPGA(如7z035)的LVDS数据采集调试实战经验。从硬件环境搭建、Vivado工具链配置到LVDS数据对齐技巧,重点分享了利用VIO抓取波形和使用F0/F8帧对齐的实用方法,帮助工程师快速解决高速数据采集系统中的信号完整性问题。

weixin_29169899的博客 703

【转】C# 二进制BinaryFormatter进行序列化与反序列化

原文:https://blog.csdn.net/e295166319/article/details/52790131 序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。 .NET框架提供了两种种串行化的方式: 1、是使用BinaryFormatter进行串行化; 2、使用XmlSe...

萝卜头敲代码 2153

Mac用户看过来!M1/M2芯片安装CiteSpace完整指南(从Homebrew到成功运行)

本文为Mac M1/M2芯片用户提供CiteSpace安装的完整指南,从Homebrew安装适配的Java环境到最终成功运行CiteSpace。详细步骤包括环境检查、Java配置、CiteSpace下载与优化,解决常见问题如内存分配、图形渲染和中文显示乱码,确保科研人员能顺利使用这一文献可视化工具。

weixin_42530458的博客 308

手把手教你用6轴IMU跑通LIO-SAM:参数配置与代码修改保姆级教程

本文提供了一套完整的6轴IMU适配LIO-SAM的解决方案,包括参数配置与代码修改的详细步骤。从理解6轴与9轴IMU的关键差异入手,逐步指导如何调整核心配置文件params.yaml、重构utility.h关键函数、优化mapOptimization.cpp的位姿融合逻辑,并给出编译验证与性能调优建议,帮助开发者快速实现6轴IMU在LIO-SAM中的稳定运行。

weixin_28717807的博客 357

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

java使用二进制序列化、反序列化的操作首先,要引入java.io下面相关包,或者直接写import java.io.*;下面,为了书写操作的方便,采用复制文件,和throws声明异常的方式来写public void test6() throws IOException {byte[] b = new byte[1024];//定义字节数组,缓冲FileInputStream in = new F...

weixin_39720807的博客 477

Unity与iOS原生交互实战指南

C#(DllImport) → C 接口(extern "C") → Objective‑C / SwiftObjective‑C → UnitySendMessage → C#(GameObject + public 方法)在写.mm文件;在里面写;C# 用声明;调用它,参数就是 string / 数值等;在.mm里做你想做的 iOS 原生操作。在 Unity 里准备一个常驻 GameObject,比如;上面挂一个脚本,写;在 iOS 插件中用;

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1357

C# 二进制BinaryFormatter和Xml进行序列化与反序列化

序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。.NET框架提供了两种种串行化的方式:1、是使用BinaryFormatter进行串行化;2、使用XmlSerializer进行串行化。第一种方式提供了一个简单的二进制数据流以及某些附加的类型信息,而第二种将数据流格式化为XML存储。    可...

蛰伏--当你不够强大时,就不要放弃努力 985

时频分析之短时傅里叶变换(STFT)

本文利用MATLAB自带的spectrogram函数对信号做短时傅里叶变换。首先介绍了短时傅里叶变换(STFT)的背景及意义;其次,对spectrogram函数的用法以及变量的含义做了详细的解释;最后,利用MATLAB编写程序实现了信号的STFT。

总结论文中的算法并给出论文的复现代码 7万+

深度学习在地质勘探中的应用:使用Python构建卷积神经网络进行地震数据分析

在本文中,我们介绍了如何利用深度学习技术,特别是卷积神经网络(CNN),来处理和分析地震数据。我们使用了Python编程语言和TensorFlow框架构建了一个CNN模型,并使用地震数据进行了训练和评估。在本文中,我们将探讨如何利用深度学习技术,特别是卷积神经网络(CNN),来处理和分析地震数据。首先,我们需要获取地震数据集。通过本文的介绍,希望您能对深度学习在地质勘探领域的应用有更深入的了解,并能够应用这些技术来解决实际问题。在准备好地震数据和构建CNN模型后,我们需要将数据分为训练集和测试集。

斌擎科技 1472

二进制的序列化与反序列化

//创建一个二进制类 void BinarySerTest() { TestSerilize testSerilize = new TestSerilize(); testSerilize.Id = 2; testSerilize.Name = “二进制”; testSerilize.List = new List(); testSerilize.List.Add(4); testSerilize...

weixin_45554040的博客 893

39、低功耗处理器性能评估与Cortex - M23/M33低功耗特性解析

本文深入解析了Cortex-M23和Cortex-M33处理器的低功耗特性及其性能评估方法。介绍了ULPMark、CoreMark、IoTMark-BLE和SecureMark-TLS等基准测试在能效评估中的应用,并详细阐述了处理器的睡眠模式、系统控制寄存器(SCR)配置、WFI/WFE指令、退出时睡眠、挂起时发送事件(SEVONPEND)以及唤醒中断控制器(WIC)等关键低功耗机制。结合状态保留技术,展示了如何通过芯片级设计大幅降低泄漏电流,实现高效能低功耗的物联网与嵌入式系统设计。

Pepper的专栏 130

C# 序列化(Serialize)与反序列化(Deserialize)

一、序列化的概念 序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候 把这个文件再转化成原来的对象使用。 需要分清楚的概念:对象的序列化而不是类的序列化。对象的序列化表明C#提供了将 运行中的对象(实时数据)写入到硬盘文件或者数据库中,此功能可以运用在需要保留 程序运行时状态信息的环境下。 使用序列化有两个最重要的原因: 一个原因是将对象的状态永久保存在存储媒体中,以便可以在以后重新创建精确的 副本; 另一个原因是通过值将对象从一个应用程序域...

weixin_50180458的博客 3793

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# 序列化与反序列化

序列化:将对象转化为二进制 反序列化:将二进制转换为对象 目的:传输数据(网络中传输数据的形式) 只有被[serializable]标记的类创建的对象才可以被序列化;但是这个类不可以被继承。 通过一个流将一个二进制文件写入到指定目的;再进过反序列化读取文件 using System.IO;  //流所在的命名空间 using System.Runtime.S

有塔耶奥多的专栏 423

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C#——二进制流序列化和反序列化

在C#中,可以使用BinaryFormatter来进行二进制的序列化和反序列化。

qq_3517289697的博客 725

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C#-二进制和XML序列化

序列化:就是把一个对象转换为可以保存的形式,以便于保持或者传输。 有两种方式: 1.二进制序列化:可以保持一个对象所有的数据,对于在应用程序的不同调用之间保留对象的状态很有用。 2.XML序列化:仅序列化公共属性和字段,而且不保留类型信息。但是XML是开放的标准,所有要在不同的系统之间 共享数据,是个很好的选择。 一. 实现二进制最简单的方法就是把类标记为Serializable。

feihu19851111的专栏 2367

C#实现序列化和反序列化

从我们面试准备上面,我知道了一个知识点,就是我们vs提供的序列化方法有两个,一个叫二进制序列化,一个叫做xml序列化,下面我们说一下二进制序列化的C#实现: 反序列化:         public static T Desrialize(T obj, string str) { try {

Davie's Happy Life 1803

C# 类的序列化和反序列化

System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 mscorlib.dll 中发生    序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。(摘自百度百科) ...

hmdong7的专栏 5703
上一篇: Unity UI分析工具
下一篇: C# Xml进行序列化与反序列化
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独立游戏开发指南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值