유니티 MemoryPack

정선호·2023년 7월 9일
0

Unity Features

목록 보기
12/28

관련 문서

개요

C#과 유니티에서 사용 가능한 직렬화 도구이다.

패키지 설치

먼저 Package Manager를 열고 Add package from git URL에서 https://github.com/Cysharp/MemoryPack.git?path=src/MemoryPack.Unity/Assets/Plugins/MemoryPack 을 입력하여 가져 온다

이제 Unsafe가 없으면 오류 메시지가 표시된다

MemoryPack의 github 저장소 에서 System.Runtime.CompilerServices.Unsafe.dll 을 다운로드 하여 Assets/Plugins 아래에 추가한다

예시 코드

메모리팩 사용 예시


using MemoryPack;
using System;

/// <summary>
/// 저장 데이터
/// </summary>
[MemoryPackable]
[Serializable]
public partial class SaveData
{
   /// <summary>
   /// ID
   /// </summary>
   /// <value></value>
   [MemoryPackOrder(0)]
   public int Id { get; protected set; } = default;

   /// <summary>
   /// 저장 일시시
   /// </summary>
   /// <value></value>
   [MemoryPackOrder(1)]
   public string Message { get; protected set; } = null;

   /// <summary>
   /// 빈 데이터 플래그
   /// </summary>
   [MemoryPackIgnore]
   public bool IsEmpty => this.Id == default;

   public SaveData()
   {
   }

   [MemoryPackConstructor]
   public SaveData(int id, string message)
   {
       this.Id = id;
       this.Message = message;
   }
}

테스터 코드

메모리팩은 선언 및 생성 없이 즉시 사용할 수 있다.

using System.IO;
using MemoryPack;
using UnityEngine;

public class Test : MonoBehaviour
{
    public void Start()
    {
        // 시리얼라이즈 초기 설정은 필요 없음
        // 시리얼라이즈한 것을 디시리얼라이즈 해본다
        var data = new SaveData(1, "메모리팩 테스트 스트링");
        
        // 직렬화 함수
        var serialized = MemoryPackSerializer.Serialize(data);
        // 역직렬화 함수
        var deserialized = MemoryPackSerializer.Deserialize<SaveData>(serialized);

        Debug.Log($"Id={deserialized.Id}, Message={deserialized.Message}");
        
        CreateOrSaveJsonFile(Application.dataPath, "SaveData", serialized);
        SaveData res = LoadJsonFile<SaveData>(Application.dataPath, "SaveData");
        Debug.Log($"Id={res.Id}, Message={res.Message}");
    }

    // 파일 저장 함수
    public void CreateOrSaveJsonFile(string createPath, string fileName, byte[] data)
    {
        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);
        fileStream.Write(data, 0, data.Length);
        fileStream.Close();
    }
    
    // 파일 불러오기 함수
    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();
        var deserialized = MemoryPackSerializer.Deserialize<T>(data);
        return deserialized;
    }
}

메모리팩 사용시 주의점

  1. 메모리팩에 저장할 데이터는 partial class로 선언되어야 한다.

  2. 메모리팩에 저장할 데이터 클래스는 [MemoryPackable], '[Serializable]어트리뷰트가 추가되어있어야 한다.

  3. 메모리팩에 저장될 데이터는 [MemoryPackOrder()]를 추가해주어야 한다.

  4. 메모리팩에 저장하지 않을 데이터는 [MemoryPackIgnore]를 추가해주어야 한다.

  5. 메모리팩에 저장할 데이터 클래스는 [MemoryPackConstructor]어트리뷰트를 지닌 생성자를 갖고 있어야 한다.
    생성자는 저장할 데이터들을 모두 매개변수에 동일한 이름으로 추가하고 this.value = value;형식으로 모두 추가해주어야 한다.

  6. 메모리팩 저장할 데이터 중 개발자의 커스텀 클래스가 있으면, 해당 클래스에도 1번부터 5번까지의 작업을 수행해주어야 한다.

  7. [MemoryPackIgnore]를 추가할 때 같은 파일에 저장되는 모든 값들의 order는 중복되면 안 된다.

profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글