SerializeField和Serializable

简介:



Serialize功能

Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系。

简单的说,在没有自定义Inspector的情况下所有显示在Inspector 中的属性都同时具有Serialize功能。

换句话说,就是你在Inspector看到什么,保存游戏的时候,这些值就会被保存成二进制文件。

本文说说可被Serialize的变量的定义方法

1. public 变量

在没有加入任何Attribute的前提下,public变量是默认被视为可以被Serialize的。

public int MaxExp;

2. [SerializeField] Attribute

强制unity去序列化一个私有域

这是一个内部的unity序列化功能,有时候我们需要Serialize一个private或者protected的属性,这个时候可以使用[SerializeField]这个Attribute:

[SerializeField]
protected int foobar = 0;

注意: 这样定义出的成员变量也是会在Inspector中显示出来。

在Unity最新的UI系统中,UI属性上方全部添加[SerializeField] ,如下所示

[SerializeField]
private Button btn1;

SerializeField参考文档:http://game.ceeger.com/Script/Attributes/SerializeField.html

3. 单独的class或struct

Serializable是.Net自带的序列化

有时候我们会自定义一些单独的class/struct, 由于这些类并没有从 MonoBehavior 派生所以默认并不被Unity3D识别为可以Serialize的结构。自然也就不会在Inspector中显示。我们可以通过添加 [System.Serializable]这个Attribute使Unity3D检测并注册这些类为可Serialize的类型。具体做法如下:

[System.Serializable]
public class FooBar {
    public int foo = 5;
    public int bar = 10;
}

注意:Serializable只可以对class,struct,enum,delegate进行序列化,不可以对属性序列化

4. ScriptableObject

ScriptableObject 类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便,具体请参考 [cb]ScriptableObject 序列化

NonSerialize的变量的定义方法

4.1. protected, private, internal 变量

默认情况下,protected, private, internal变量将不会被serialize.

4.2. [System.NonSerialized] Attribute

有时候我们需要定义一些public变量方便操作,但是又不希望这些变量保留。这个时候可以利用[System.NonSerialized]来完成这个操作:

[System.NonSerialized] public float foobar = 1.0f;

4.3. readonly, const, static 修饰符

如果变量加入了readonly, const, static等修饰符,无论他的serialize设置如何,都将不会进行serialize

4.4. Dictionary<T,K>

Unity3D可以对List<T>进行序列化显示,但是由于他们的程序员偷懒或不够强大,以至于我们到现在都不能serialize Dictionary<T,K>这么一个较为常用的类型。通常我们会通过Serialize一份List<T>,然后在 Awake中初始化Dictionary的方法来完成Dictionary的serialize操作。如:

复制代码
[System.Serializable]
public class NameToID {
    public string name = "";
    public int ID = -1;
}
public List<NameToID> nameToIDList = new List<NameToID>();  
Dictionary<string,int> nameToID = new Dictionary<string,int>();  
//
void Awake () {
    foreach ( NameToID info in nameToIDList ) {
        nameToID[info.name] = info.ID;
    }
    nameToIDList = null; // put it null make garbage collect it (I wish)
}
复制代码

在Inspector中的显示

变量在Inspector中会根据变量的大写字母来隔开来显示,并且会将首字母强制大写的方式显示。 如:

public int myFooBar = 0;

在GUI将会显示为: My Foo Bar


本文内容转载自:http://www.cnblogs.com/oldman/articles/2409523.html


本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/3995304.html,如需转载请自行联系原作者


相关文章
|
3月前
|
存储 Java
|
6月前
|
存储 JSON NoSQL
关于 Serializable的探讨
本文探讨了Java中的Serializable接口和serialVersionUID字段。Serializable是用于对象序列化的标记接口,用于持久化、传输或缓存对象状态。serialVersionUID是一个版本控制标识,确保反序列化时类版本兼容。它主要适用于Java内置序列化,不涉及JSON等其他序列化方式。作者还分享了一个在项目中考虑使用CountMinSketch数据结构但最终选择其他方法的例子,并建议在非必要情况下,DTO和VO对象可以不实现Serializable。
|
存储 Java
Serializable接口的意义和用法
Serializable接口的意义和用法
|
JSON Java 数据库连接
87. Java序列化和反序列化为什么要实现Serializable接口
87. Java序列化和反序列化为什么要实现Serializable接口
193 0
|
存储 Java Android开发
Parcelable与Serializable
跟大家分享一下Android的序列化
105 0
|
存储 缓存 算法
HttpServlet为什么要实现serializable?
HttpServlet为什么要实现serializable?
125 0
HttpServlet为什么要实现serializable?
|
存储 Java
【Java】Serializable序列化
Serializable序列化“持久化”意味着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间。通过序列化一个对象,将其写入磁盘,以后在程序再次调用时重新恢复那个对象,就能圆满实现一种“持久”效果。
162 0
|
算法 Java 安全
Serializable原理
序列化是将对象变为可传输内容的过程, 反序列化则是将可传输内容转化为对象的过程. Java原生序列化方式是通过实现Serializable接口实现的. 不实现该接口会导致无法序列化, 抛出异常如下: java.io.NotSerializableException 序列化的应用场景: 将对象转换为字节流, 用于网络传输, 例如用于RPC远程调用。
5080 0
|
Android开发 Java 存储
序列化Parcelable和Serializable的区别
Parcelable和Serializable有什么用,它们有什么差别? Parcelable和Serializable都可以实现序列化,使对象可以变为二进制流在内存中传输数据。
3159 0