유니티 Json 직렬화

정선호·2023년 5월 12일
0

Unity Features

목록 보기
3/28

직렬화(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);
    }
}
profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글