Unity与C#的序列化与反序列化
来源:互联网 发布:2016年双11数据分析 编辑:程序博客网 时间:2024/05/16 05:42
序列化操作在我们的开发中使用的十分普遍,本文记录了公司最近分享会上关于这部分的讲解,希望能帮助大家对序列化有更系统的了解。
概念
序列化又称串行化,是.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。
本文转自https://zhuanlan.zhihu.com/p/27990334
- Unity与C#的序列化与反序列化
- c#序列化与反序列化
- C#序列化与反序列化
- C#序列化与反序列化
- c#序列化 与 反序列化
- C#序列化与反序列化
- C# 序列化与反序列化
- C#序列化与反序列化
- C#序列化与反序列化
- C#序列化与反序列化
- C# 序列化与反序列化
- C#序列化与反序列化
- C# 序列化 与 反序列化
- C#序列化与反序列化
- C# 序列化与反序列化
- C#序列化与反序列化
- c#序列化与反序列化
- C#序列化与反序列化
- Tensorflow之TensorBoard的使用
- spark编程模型与基本架构图
- 动态规划学习(2)
- CSS(十二)
- 生活小记64
- Unity与C#的序列化与反序列化
- 在android studio里怎找到代码相对应的文件
- 虚拟机网络配置笔记===收集资料
- CSS(十三)
- spring mvc+ajax返回json字符串的方式
- CSS(十四)
- Shell编程学习(1)----shell和shell中的变量
- CPU调度
- Learning NHibernate 4.pdf 英文原版 免费下载