什么是序列化和反序列化
(1)序列化是指把對象轉換為字節序列的過程,而反序列化是指把字節序列恢復為對象的過程;.
(2)序列化:對象序列化的最主要的用處就是在傳遞和保存對象的時候,保證對象的完整性和可傳遞性。序列化是把對象轉換成有序字節流,以便在網絡上傳輸或者保存在本地文件中。序列化后的字節流保存了對象的狀態以及相關的描述信息。序列化機制的核心作用就是對象狀態的保存與重建。
(3)反序列化:客戶端從文件中或網絡上獲得序列化后的對象字節流后,根據字節流中所保存的對象狀態及描述信息,通過反序列化重建對象
(4)本質上講,序列化就是把實體對象狀態按照一定的格式寫入到有序字節流,反序列化就是從有序字節流重建對象,恢復對象狀態。
2、為什么需要序列化與反序列化
我們知道,當兩個進程進行遠程通信時,可以相互發送各種類型的數據,包括文本、圖片、音頻、視頻等, 而這些數據都會以二進制序列的形式在網絡上傳送。
那么當兩個進程進行通信時,能否實現進程間的對象傳送呢?答案是可以的!如何做到呢?這就需要序列化與反序列化了!
換句話說,一方面,發送方需要把這個對象轉換為字節序列,然后在網絡上傳送;另一方面,接收方需要從字節序列中恢復出對象。
當我們明晰了為什么需要Java序列化和反序列化后,我們很自然地會想序列化的好處。其好處一是實現了數據的持久化,通過序列化可以把數據永久地保存到硬盤上(通常存放在文件里),二是,利用序列化實現遠程通信,即在網絡上傳送對象的字節序列。
總的來說可以歸結為以下幾點:
(1)永久性保存對象,保存對象的字節序列到本地文件或者數據庫中;
(2)通過序列化以字節流的形式使對象在網絡中進行傳遞和接收;
(3)通過序列化在進程間傳遞對象;

using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using Newtonsoft.Json; public class TestJSON : MonoBehaviour { void Start() { Product product = new Product(); product.dic["鍵"] = "值"; product.name = "小明"; string json = JsonConvert.SerializeObject(product); Product m = JsonConvert.DeserializeObject<Product>(json); Debug.Log(json); Debug.Log(m.name); } public class Product { public string name; public Dictionary<string, string> dic = new Dictionary<string, string>(); } }


需要導入命名空間 using System.IO; using System.Xml.Serialization; using UnityEditor; 先定義一個類: public class Studnet{ public string m_Name = "侖侖"; } public class SerializeDemo : MonoBehaviour { void Start() { 序列化: Student student = new Student(); //第一要確定儲存的位置 //Application.dataPath就是unity中的Asset文件夾 StreamWriter sw = new StreamWriter(Application.dataPath + "/Demo.xml"); //第二要對什么類型序列化 XmlSerializer xs = new XmlSerializer(typeof(Student)); //第三對對象序列化 xs.Serialize(sw, student); //關閉流 sw.Close(); //刷新Asset文件 AssetDatabase.Refresh(); //運行程序會在Asset目錄下看到Demo.xml文件 反序列化 //第一確定對哪個文件進行反序列化 StreamReader sr = new StreamReader(Application.dataPath + "/Demo.xml"); //第二要確定對什么類型反序列化 XmlSerializer xs1 = new XmlSerializer(typeof(Student)); //第三反序列化 Student student1 = xs1.Deserialize(sr) as Student; //關閉流 sr.Close(); //會在控制台看到 “侖侖” print(student1.m_Name); } }