직렬화(Serialization)
- 직렬화는 객체를 파일의 형태 등으로 저장하거나, 통신하기 쉬운 포맷으로 변환하는 과정
- 역직렬화(Deserialization)을 이용해 다시 객체로 변환할 수 있다
Unity 기본 제공 툴로 실시하는 Json직렬화
namespace Data
{
// referenced blog : https://wergia.tistory.com/164
// This class is for converting JSON files to any types
// To use it, add this class reference on other classes
public class JsonConverter
{
// convert string to JSON format
public string ObjectToJson(object obj)
{
return JsonUtility.ToJson(obj, true);
}
// convert JSON format to string
public T JsonToObject<T>(string jsonData)
{
return JsonUtility.FromJson<T>(jsonData);
}
// save JSON files written on string
public void CreateOrSaveJsonFile(string createPath, string fileName, string jsonData)
{
string file = string.Format("{0}/{1}.json", createPath, fileName);
if (File.Exists(file))
{
File.Delete(file);
}
FileStream fileStream = new FileStream(file, FileMode.Create, FileAccess.Write);
byte[] data = Encoding.UTF8.GetBytes(jsonData);
fileStream.Write(data, 0, data.Length);
fileStream.Close();
}
// load JSON files to generic types
public T LoadJsonFile<T>(string loadPath, string fileName)
{
FileStream fileStream = new FileStream(string.Format("{0}/{1}.json", loadPath, fileName), FileMode.Open, FileAccess.Read);
byte[] data = new byte[fileStream.Length];
fileStream.Read(data, 0, data.Length);
fileStream.Close();
string jsonData = Encoding.UTF8.GetString(data);
return JsonUtility.FromJson<T>(jsonData);
}
public void CreateOrSaveEncryptedJsonFile(string createPath, string fileName, string jsonData)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(jsonData);
string code = System.Convert.ToBase64String(bytes);
File.WriteAllText(string.Format("{0}/{1}.json", createPath, fileName), String.Empty);
File.WriteAllText(string.Format("{0}/{1}.json", createPath, fileName), code);
}
public T LoadEncryptedJsonFile<T>(string loadPath, string fileName)
{
string code = File.ReadAllText(string.Format("{0}/{1}.json", loadPath, fileName));
byte[] bytes = System.Convert.FromBase64String(code);
string jsonData = System.Text.Encoding.UTF8.GetString(bytes);
T result = JsonUtility.FromJson<T>(jsonData);
return (result);
}
}
}
외부 툴(Newton)을 이용한 Json 직렬화
using Newtonsoft.Json;
public class JsonConverter : MonoBehaviour
{
public static void Save<T>(T objectToSave, string fileName)
{
FileStream stream = new FileStream(fileName, FileMode.OpenOrCreate);
string jsonData = JsonConvert.SerializeObject(objectToSave);
byte[] data = Encoding.UTF8.GetBytes(jsonData);
stream.Write(data, 0, data.Length);
stream.Close();
}
public static bool Load<T>(out T objectToLoad, string fileName) where T : new() // 인스턴스가 없을떄만 사용가능
{
objectToLoad = new T();
if (File.Exists(fileName)) // 파일이 있으면 읽고 objectToLoad 객체에 담는다.
{
FileStream stream = new FileStream(fileName, FileMode.Open);
byte[] data = new byte[stream.Length];
stream.Read(data, 0, (int)stream.Length);
string jsonData = Encoding.UTF8.GetString(data);
objectToLoad = JsonConvert.DeserializeObject<T>(jsonData);
stream.Close();
return true;
}
else
{
return false;
}
}
public void DeleteJson(string fileName)
{
if (File.Exists(Application.dataPath + fileName))
File.Delete(Application.dataPath + fileName);
}
}