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;
}
}
메모리팩에 저장할 데이터는 partial class
로 선언되어야 한다.
메모리팩에 저장할 데이터 클래스는 [MemoryPackable]
, '[Serializable]
어트리뷰트가 추가되어있어야 한다.
메모리팩에 저장될 데이터는 [MemoryPackOrder()]
를 추가해주어야 한다.
메모리팩에 저장하지 않을 데이터는 [MemoryPackIgnore]
를 추가해주어야 한다.
메모리팩에 저장할 데이터 클래스는 [MemoryPackConstructor]
어트리뷰트를 지닌 생성자를 갖고 있어야 한다.
생성자는 저장할 데이터들을 모두 매개변수에 동일한 이름으로 추가하고 this.value = value;
형식으로 모두 추가해주어야 한다.
메모리팩 저장할 데이터 중 개발자의 커스텀 클래스가 있으면, 해당 클래스에도 1번부터 5번까지의 작업을 수행해주어야 한다.
[MemoryPackIgnore]
를 추가할 때 같은 파일에 저장되는 모든 값들의 order는 중복되면 안 된다.