Unity与C#的序列化与反序列化

Unity | 序列化(Serialized)和反序列化(NonSerialized)是什么意思 简单理解序列化(Serialized)和反序列化(NonSerialized)是什么意思? 阅读详情

序列化操作在我们的开发中使用的十分普遍,本文记录了公司最近分享会上关于这部分的讲解,希望能帮助大家对序列化有更系统的了解。

概念

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

简单来说就是将对象保存到文件中。如Unity的场景文件和预制体默认就是以二进制的文件保存在工程目录下。

Unity序列化

在Unity中,在检视面板中可以看到的,就是被成功序列化了的参数。与序列化相关的常用的关键字有SerializeField,HideInInspector,NonSerialized,Serializable并可以组合使用。

  • SerializeField : 表示变量可被序列化。众所周知,公有变量可以在检视面板中看到并编辑,而私有和保护变量不行。SerializeField与private,protected结合使用可以达到让脚本的变量在检视面板里可视化编辑,同时保持它的私有性的目的。
  • HideInInspector : 将原本显示在检视面板上的序列化值隐藏起来。
  • NonSerialized :通过此方法可以将一个公有变量不序列化并且不显示在检视面板中。
  • Serializable:用在类的前面,表示该类可被序列化。

下面用一段代码来举例说明:

public class Test :Monobehavior
{
    public int  a;                               //序列化,显示
    private int b;                               //不序列化,不显示
    [SerializeField ] int c;                     //序列化,显示
    [HideInInspector] public int d;              //序列化,不显示
    [NonSerialized ] public int e;               //不序列化,不显示
    public Test2 test2;                          //序列化,显示(可序列化的部分)
}

[Serializable ]
public class Test2
{
     public int aa;
     private int bb;
}

我们新建一个Test脚本来验证一下,输入上述代码后观察检视面板:

然后将挂在脚本的预制体用Sublime打开观察序列化部分:

耶,成功了!

此外,Unity还有类SerializedObject,常用于编辑器模式下的工具或导入器中,修改资源或者Prefab的属性。具体可参考官方文档:

https://docs.unity3d.com/ScriptReference/SerializedObject.html

注意:并非所有的公有变量都是可以被序列化的。其中const,static是静态的,属于类而非对象,无法序列化。链表和字典在内存中的存储是不连续的,也无法序列化。其中const,static,readonly的区别可参考文章:

http://www.cnblogs.com/suizhikuo/p/4739388.html

 

C#序列化

简单介绍两种常用的C#序列化操作(二进制方法和XML方法)

首先我们先定义一个可被序列化的类DemoClass

[Serializable]
public class DemoClass
{
    public int _id;
    public string _myName;
    public DemoClass(int id, string myName)
    {
        _id = id;
        _myName = myName;
    }
    public DemoClass()
    {
    }
    public void Output()
    {
        Debug.LogError(_id);
        Debug.LogError(_myName);
    }
}

它包含两个公有变量id和name,一个含参的构造函数和一个默认构造函数(二进制不需要,XML必须), 一个用于显示的输出函数。

 

二进制方法(Binary Formatter)

序列化:新建或打开一个二进制文件,通过二进制格式器将对象demo写入该文件中。

void WriteTest()
{
    DemoClass demo = new DemoClass (100, "RCD");
    FileStream fs = new FileStream ("demo.bin", FileMode.OpenOrCreate);
    BinaryFormatter bf = new BinaryFormatter ();
    bf.Serialize (fs, demo);
    fs.Close ();
    Debug.LogError ("write done");
}

反序列化:打开待反序列化的二进制文件,通过二进制格式器将文件解析成对象demo,并输出到控制台。

void ReadTest()
{
    FileStream fs = new FileStream("demo.bin", FileMode.Open);
    BinaryFormatter bf = new BinaryFormatter();
    DemoClass demo = bf.Deserialize(fs) as DemoClass;
    fs.Close();
    demo.Output();
}

 

耶,成功了!

注意:二进制方法可以序列化私有变量,不能序列化被[NonSerialized ]修饰的变量且类需要被[Serializable ]标识。

 

XML方法(XML Serializer)

序列化与反序列化与二进制方法十分类似。

void WriteTest()
{
    DemoClass demo = new DemoClass(100, "RCD");
    FileStream fs = new FileStream("demo.xml", FileMode.OpenOrCreate);
    XmlSerializer xml = new XmlSerializer(typeof(DemoClass));
    xml.Serialize(fs, demo);
    fs.Close();
    Debug.LogError("write done");
}

void ReadTest()
{
    FileStream fs = new FileStream("demo.xml", FileMode.Open);
    XmlSerializer bf = new XmlSerializer(typeof(DemoClass));
    DemoClass demo = bf.Deserialize(fs) as DemoClass;
    fs.Close();
    demo.Output();
}

 

耶,成功了!

注意:XML方法中类不需要[Serializable]标识,不能序列化私有变量,[NonSerialized]这个标识在该方法中无效。

区别:

  • 二进制方法:性能好,体积小。
  • XML方法:可读性强,但体积较大,可在无其他环境时使用。

 

总结

本文介绍了Unity中序列化相关的关键字及其区别和用法,C#中两种序列化与反序列化的方法。

希望大家在日常开发中合理使用SerializeField,不用滥用Public。

Unity-Unity中的序列化 序列化是什么? 序列化就是将对象的状态信息转换为可以存储或传输形式的过程。其实就是将对象持久化,比如说把对象保存为二进制或者是XML的方式。可以将对象序列到流、磁盘、内存和网络等等。相反,反序列化则是将存储或传输形式转换为对象的过程。 有什么用? (1)以某种存储形式(二进制或者是XML等)使对象持久化。序列化和反序列化用来保存内存中的数据,它不是C#中独有的技术,比如win7的休眠就是该技术的应... 阅读详情

相关推荐

序列化反序列化C# Unity数据类暴露在Inspect

序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 S...

zebin的博客 1255

Unity:序列化

什么是序列化 序列化是一种用来处理对象流的机制,所谓对象流就是将对象内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输。 序列化的作用 在Unity中序列化有以下3个作用: 可以显示变量(类,结构等)在inspector(检视面板)上 数据持久化 网络传输 序列化关键字 Serializable: 用于 自定义的,非 abstract 的类. 结构体等 , 使这类型也能序列化 SerializeField: 用于 非public 类型(如private), 使非public 类型也能序

m0_53438035的博客 3726

(unity)xml序列化和反序列化

(日常简单小笔记,欢迎提意见~) C#的xml序列化 类转成xml 类转成二进制 一、类转成xml的序列化和反序列化 例如:以下定义的一个需要转成xml的类(不继承于 MonoBehaviour )。 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Xml.S...

C_haning的博客 906

序列化和反序列化 —— unity篇

深入浅出理解序列化 —— unity篇

IT外猩人的博客 5138

C#篇-unity和序列化和反序列

C#篇-unity和序列化和反序列 标签(空格分隔): C# C篇-unity和序列化和反序列 简介 C完成序列化和反序列化 如何控制类型可序列化 序列化反序列化中上下文 unity中的序列化和反序列化 unity中序列化的注意事项 自定义序列化 序列化和反序列内部过程 简介 所谓序列化就是将对象转换为字节流,反序列化则是字节流转换回对象 C#完成序列化和反序

新博客地址http://www.cnblogs.com/millionsmultiplication/ 2210

Unity中的序列化和反序列化

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

L的博客 7946

unity C#中使用Newtonsoft.Json进行字符串的序列化和反序列化简易教程

一.背景介绍 1.什么是json JSON (JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,几乎所有编程语言都有解析JSON的库。——百度百科 推荐一个在线解析网站;https://www.json.cn/

weixin_43787178的博客 2748

【unity小技巧】unity/C#对文件文件夹的操作,转换二进制数据,并实现持久化读取存储二进制数据,对C#类对象进行二进制序列化和反序列化并存储读取

之前我已经写过了实现对Json数据的序列化和反序列化持久化存储: 【推荐100个unity插件之37】unity使用三种方式实现对Json数据的序列化和反序列化持久化存储,并举例分析JsonUtlity、LitJSON和Newtonsoft的区别清晰易懂是他的好处,但是也是一把双刃剑,比如如果我们用json存储数据,只要玩家找到对应的存储信息,就能够快速修改其中的内容(当然我们可以对数据进行加密)。而且由于他把数据转换成了对应的json字符串,我们最终在存储数据时存储的都是字符串数据,在读写时效率较低,内存

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1893

Unity C#序列化和反序列化(.bin .xml .json)

在Unity中,在检视面板中可以看到的,就是被成功序列化了的参数。Json的序列化UnityPackge里有很多现成的插件"com.unity.modules.jsonserialize": “1.0.0”,,这是Unity官方推荐的Newtonsoft.Json,相对功能要更加的强大。其中const,static是静态的,属于类而非对象,无法序列化。它包含两个公有变量id和name,一个含参的构造函数和一个默认构造函数(二进制不需要,XML必须), 一个用于显示的输出函数。

Cxihu田树东的游戏开发博客 1725

QMT中ContextInfo的使用注意

QMT中ContextInfo下声明的全局变量的使用注意事项

路在何方 2809

【电弧故障检测算法全解析,电弧串扰问题分析和解决算法】

本文系统分析了电弧故障检测算法及串扰问题解决方案。电弧检测主要采用时频域分析和机器学习方法,通过提取高频噪声、波形畸变等特征实现故障识别。针对电弧串扰问题,提出了自适应滤波、盲源分离和时频联合分析等算法。研究给出了Python和C语言的算法实现示例,包括高频能量检测、过零率计算和陷波滤波器设计。最后指出算法优化方向:实时性提升可采用滑动窗口FFT和硬件加速;抗干扰增强需结合硬件滤波;机器学习扩展可引入随机森林等分类器。该研究为电弧故障检测系统开发提供了完整的技术路线。

syttt的专栏 891

文章收藏2:Unity与C#的序列化与反序列化

http://www.manew.com/thread-142549-1-1.html

Hexinxxx的博客 211

ROS2前置基础教程 | 使用CMakeLists.txt编译ROS2节点

答案是有的,那就是cmake工具。cmake通过调用CMakeLists.txt直接生成Makefile。 2.新建CMakeLists.txt 在新建,输入下面内容。 3.编译代码 我们一般会创建一个新的目录,运行cmake并进行编译,这样的好处是不会显得那么乱。 创建好文件夹,接着运行cmake指令,代表到上级目录找。 运行完cmake你应该可以在build目录下看到cmake自动生成的Makefile了,接着就可以运行make指令进行编译 运行完上面的指令,就可以在build目录下发现节点了。ROS2

生活不止眼前的苟且 1万+

c# excel导出png_Unity 基于excel2json批处理读取Excel表并反序列化

excel2json是一款将Excel表格文件快速生成json和C#数据类的高效插件,详情了解如下:https://neil3d.github.io/coding/excel2json.html该插件有两种模式,分别是命令行和图像界面;为了更方便愉快的进行大规模转换,可以写两个批处理文件来实现:Single文件执行单个选中Excel文件转换,AutoAll则执行该路径下所有xlsx文件...

weixin_39731916的博客 262

手把手教你用VSCode+SDL在Ubuntu上跑LVGL8.2模拟器(附插件清单)

本文详细介绍了在Ubuntu系统上使用VSCode和SDL库搭建LVGL8.2模拟器环境的完整流程,特别适合嵌入式开发者(如全志F1C100s平台)进行UI设计验证。从环境配置、项目编译到VSCode深度集成,提供了实用技巧和常见问题解决方案,帮助开发者实现'先模拟后真机'的高效开发模式。

weixin_33737134的博客 358

S32K1XX调试--快速定位HardFault

1、背景 程序运行,发现程序跑飞到HardFault,但不清楚为什么会跑到HardFault中断处理函数去。 2、分析 要想知道为什么会跑到HardFault_Handler中去,就很有必要了解一下,程序上一条执行的是那条命令。 根据汇编指令可以定位上条指令,但如果对汇编指令不是很了解的话,那就很头疼了 根据单步运行也能实现定位,但如果程序量很大,又很杂,可能花费的时间就比较久些。 3、问题查找 提供一种不需要懂汇编指令的查找方法,方法如下: 在中断处理函数中插入以下代码,以及另外定义

ping_devil的博客 4019

Unity 中使用C#的序列化和反序列化处理游戏数据

这段时间在研究和学习C#的序列化和反序列化的东西。发现这是一个非常友好的数据本地store的方式。但是在使用过程中也有很多有意思的地方,我这里把我越到的问题列一下。我使用的是C#的二进制形式的序列化和反序列化。 参考了这里,还有这里。这两个参考地方都有对于的code。从code中可以得到的结果是:在serialize之前,都是将需要序列化的数据放到一个结构体里面去,然后开始序列化。对于这个被

liangZG的专栏 4015

Flutter SDK的删除与重装:一步步教你如何轻松搞定

在Flutter开发过程中,我们可能会遇到一些需要重新安装Flutter SDK的情况,例如升级Flutter版本、解决依赖冲突等。本文将详细介绍如何删除并重新安装Flutter SDK,让你轻松应对各种问题。

理论都是虚的,代码才是王道。 2247

Unity与C#的序列化与反序列化【转载】

  序列化操作在我们的开发中使用的十分普遍,本文记录了公司最近分享会上关于这部分的讲解,希望能帮助大家对序列化有更系统的了解。 概念 序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形式使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。 简单来说就是将对象保存到文件中。如Unity的场景文件和预制体默认就是以二进制的文件保存在工程目录下...

qq_36684665的博客 1190

apt-get update时出现GPG error:... bionic InRelease:The following signatures were invalid: EXPKEYS解决方案

本文主要介绍了apt-get update时出现W: GPG error: … bionic InRelease: The following signatures were invalid: EXPKEYSIG B7B3B788A8D3785C MySQL Release Engineering E: The repository ‘… bionic InRelease’ is not signed.解决方案,希望能对使用Ubuntu系统的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

SNAP计算哨兵2号的LAI/FVC/FAPAR

SNAP的计算LAI方法是基于PROSAIL模型,集成的模块,很方便。首先要下载SNAP软件,下载步骤见。

所有专家都曾始于新手 2507

C# unity FlatBuffer序列化和反序列化代码

using com.gameconfig; using FlatBuffers; using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; public class Test1 : MonoBehaviour {     // Star...

springhao123的专栏 1173

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

unity newtonsoft 反序列化报空_开发者应当熟知的 C# 序列化和反序列化

作者 | 喵叔责编 | 刘静出品 | 优快云(ID:优快云news)今天我利用这篇文章给大家讲解一下 C# 中的序列化与反序列化。这两个概念我们在开发中经常用到,但是我们绝大部分只用到了其中的一部分,剩下的部分很多开发人员并不清楚,伸着可以说是不知道。因此我希望通过这篇文章能让各位对序列化和反序列化的知识有更进一步的掌握。废话不多说开始进入正题。什么是序列化/反序列化在所有的开发语言中都存在序...

weixin_39915815的博客 261

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

flatBuffer for unity c#高效序列化与反序列化

1-第一步是获取“ flatc”编译器和“ FlatBuffers.dll” 首先官方下载链接:flatc.exe文件https://github.com/google/flatbuffers/releases 变异dll的源文件:不推荐):https://github.com/google/flatbuffers源代码中的“ \ net \ FlatBuffers”文件夹,打开“ FlatB...

qq_17347313的博客 2986

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Unity】序列化与反序列化

本文将介绍Xml、二进制文件、Assets文件的序列化与反序列化操作。实际就是类对象与这三种文件之间的转换。

Davidorzs的博客 2160
上一篇: UE4中的Collision Channels
下一篇: 在Unity中实现相机抖动特效
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值