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

支付宝支付(三):周期扣款实现注意细节

一、周期扣款实现说明 1、官方文档入口:https://opendocs.alipay.com/open/20190319114403226822/intro 2、根据官方文档说明,周期扣款有两种方式:先签约后代扣场景和支付后签约场景 3、周期扣款接入问题文档: a>https://opendocs.alipay.com/support/01rg24 b>https://opensupport.alipay.com/support/knowledge/50249/20160248753

新鲜雾霾的博客 5702

WPS和Excel通用!省市区四级联动下拉菜单保姆级教程(附最新行政区划数据包)

本文详细介绍了在WPS和Excel中实现省市区四级联动下拉菜单的完整教程,包含2024年最新行政区划数据的获取与整理方法。通过名称管理器和INDIRECT函数的组合,以及WPS的特色功能,帮助用户高效准确地录入四级行政区划信息,提升数据录入效率并减少错误。

s1t2u3的博客 611

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

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

Hexinxxx的博客 211

告别纯文本RAG:用Dify 1.11.0多模态知识库,5步搭建一个能“读图”的智能客服助手

本文详细介绍了如何利用Dify 1.11.0多模态知识库构建智能视觉客服助手,通过5个步骤实现图片内容理解与专业回复。从准备多模态素材到配置知识库节点,再到设计工作流逻辑和性能优化,帮助开发者快速搭建高效客服系统,显著提升用户体验和问题解决效率。

weixin_30832143的博客 452

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

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

weixin_39731916的博客 262

25年PINN创新点大盘点!

在科研论文的激烈角逐中,想轻松产出高含金量成果?物理信息神经网络(PINN)堪称“宝藏研究方向”,是冲击高分区论文的绝佳赛道!对于渴望发表优质论文的科研伙伴,这三大研究路径值得重点关注。首先是自适应PINN,在PINN训练过程中,物理方程与实测数据间的矛盾常常导致权重调节困难,而恰好直击这一痛点,是极具价值的研究方向。其次,同样前景广阔,传统多物理场同时训练效果欠佳,如今分阶段训练方法脱颖而出,成效显著且竞争较小。最后,探索及多任务学习等技术的融合,能实现优势叠加,碰撞出创新火花。

Malaai的博客 1970

Flink CDC 实战:5分钟搞定PostgreSQL数据实时同步(附避坑指南)

本文详细介绍了如何使用Flink CDC实现PostgreSQL数据的实时同步,包括环境配置、逻辑复制槽创建、Flink环境搭建及实战验证。通过5分钟快速指南,帮助开发者高效搭建实时数据管道,并提供了常见问题排查和生产环境优化建议。

red88的博客 819

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

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

liangZG的专栏 4015

(王道408考研数据结构)第一章绪论-第二节1:算法的基本概念、算法的特性及设计要求

算法(Algorithm):是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作王道视频课中讲到了一个例子,展示了算法就是解决问题的特定步骤的描述对于给定的问题可以有多种多样的算法来解决,只不过这些算法有各自的优点和缺点。

快乐江湖的博客 2684

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

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

qq_36684665的博客 1190

微信小程序 - 解决报错 {“errcode“:41002,“errmsg“:“appid missing, rid: X“} 微信报错错误码errcode“:41002问题分析及解决教程(详细排查)

【微信小程序】报错{“errcode“:41002,“errmsg“:“appid missing, rid: 64e55770-67c1fb7e-027c5a70“}:【微信小程序】微信小程序登录请求出现appid missing提示,微信公众号{"errcode":41002,"errmsg":"appid missing"},微信 报错{“errcode“:41002,“errmsg“:“appid missing,微信小程序获取openid返回appid missing的问题,微信小程序提示Erro

🏆 前端领域优质创作者 5654

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

weixin_39915815的博客 261

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

【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、付费专栏及课程。

余额充值