SerializeField和Serializable

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

时间: 2024-10-06 15:55:09

SerializeField和Serializable的相关文章

Unity中HideInInspector和SerializeField以及Serializable

首先,Unity会自动为Public变量做序列化,序列化的意思是说再次读取Unity时序列化的变量是有值的,不需要你再次去赋值,因为它已经被保存下来. 然后是,什么样的值会被显示在面板上? 已经被序列化,但是没有用HideInInspector标记的值. [HideInInspector]表示将原本显示在面板上的序列化值隐藏起来. [SerializeField]表示将原本不会被序列化的私有变量和保护变量可以序列化,这么他们在下次读取时,就是你上次赋值的值. 1如果name是公有的序列化变量.

SerializeField和HideInInspector

在Unity中,一个变量为公有类型,但是呢你不想让它显示在属性面板上,这个时候用 [HideInInspector] 这是隐藏的意思,举例: 用了[HideInInspector] 之后 就是这样用的,还有一个 [SerializeField] 是显示的意思,它用在你的私有变量想在属性面板出现的情况下,这里不演示了 还有一个 [System.Serializable] 这个写在类的外面,为其他的一个类或者枚举写在上面,这样的话呢这个类或者枚举就可以当做变量来使用了

[System.Serializable],

[System.Serializable]添加在类,枚举,结构前面,可以让该这些对象在inspector中显示 [SerializeField]是设置非public 成员对象在inspector中显示

UnityEngine.SerializeField

[UnityEngine.SerializeField] Force Unity to serialize a private field. 强制Unity序列化一个私有变量. You will almost never need this. When Unity serializes your scripts, it will only serialize public fields. If in addition to that you also want Unity to serializ

Java中的Serializable接口的作用

转载自:http://blog.csdn.net/shehun11/article/details/40300439 所谓的Serializable,就是java提供的通用数据保存和读取的接口.至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了.这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方.也可以用管道来传输到系统的其他程序中.这样子极大的简化了类的设计.只要设计一个保存一个读取功能就能解决上面说得所有问题. Obj

序列化与反序列化总结(Serializable和Parcelable)

序列化是指将对象的状态信息转换为可以存储或传输的形式的过程. 在Java中创建的对象,只要没有被回收就可以被复用,但是,创建的这些对象都是存在于JVM的堆内存中,JVM处于运行状态时候,这些对象可以复用, 但是一旦JVM停止,这些对象的状态也就丢失了. 在实际生活中,需要将对象持久化,需要的时候再重新读取出来,通过对象序列化,可以将对象的状态保存为字节数组,需要的时候再将字节数组反序列化为对象. 对象序列化可以很容易的在JVM中的活动对象和字节数组(流)之间转换,广泛用于RMI(远程方法调用)以

面试题:Java中对象序列化接口(Serializable)的意义

Serializable接口是一个里面什么都没有的接口 它的源代码是public interface Serializable{},即什么都没有. 如果一个接口里面什么内容都没有,那么这个接口是一个标识接口,比如,一个学生遇到一个问题,排错排了几天也没解决,此时,她举手了(示意我去帮他解决),然后我过去,帮他解决了,那么这个举手其实就是一个标识,自己不能解决的问题标示我去帮他解决,在Java中的这个Serializable接口是给JVM看的,告诉JVM,我不做这个类的序列化了,你(JVM)给我序

Android Serializable与Parcelable原理与区别

一.序列化.反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程.对象的反序列化:把字节序列恢复为Java对象的过程. (2) 序列化详细解释 对象的序列化涉及三个点关键点:Java对象.字节序列.存储. 1. Java对象的组成?Java对象包含变量与方法.但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理. 2. 什么是字符序列?字符序列是两个词,字符是在计算机和电信领域中,字符(Character)是一个

Android中Serializable和Parcelable序列化对象详解

学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.Parcelable的工作原理 6.相关实例 1.序列化的目的 (1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中 (2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式) (3).将对象数据在进程