しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity で MemoryPack for C# でシリアライズする

※ これは 2022/12/01 時点の Unity 2022.1.23f1 MemoryPack for C# v1.8.12 の情報です

最新版では動作が異なる可能性がありますのでご注意ください

少し前に使ってみた MessagePack for C# について

matatabi-ux.hateblo.jp

なんと性能がアップした後継のライブラリ MemoryPack for C# がリリースされたようなので、MessagePack から移行する形で使ってみたい

github.com

まずは Package Manager を開き、Add package from git URLhttps://github.com/Cysharp/MemoryPack.git?path=src/MemoryPack.Unity/Assets/Plugins/MemoryPack を入力してインポート

add from git

これで Unsafe がないとエラーメッセージが出る場合・・・

エラーメッセージ

MemoryPack の github リポジトリ から System.Runtime.CompilerServices.Unsafe.dll をダウンロードして Assets/Plugins 配下に追加する

System.Runtime.CompilerServices.Unsafe.dll 追加

ここから MessagePack から MemoryPack へのコード移行

SaveData.cs は下記のような感じで、[MessagePackObject][MemoryPackable][Key][MemoryPackOrder][IgnoreMember][MemoryPackIgnore][SerializationConstructor][MemoryPackConstructor] にそれぞれ書き換える

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;
    }
}

次に Test.cs

MessagePackSerializerMemoryPackSerializer に書き換える

using MemoryPack;
using UnityEngine;

public class Test : MonoBehaviour
{
    public void Awake()
    {
        // シリアライザの初期設定
        // いらない!
    }

    public void Start()
    {
        // シリアライズしたものをデシリアライズしてみる
        var data = new SaveData(1, "ラグドールもふもふ巨大ねこ");
        var serialized = MemoryPackSerializer.Serialize(data);
        var deserialized = MemoryPackSerializer.Deserialize<SaveData>(serialized);

        UnityEngine.Debug.Log(
            $"Id={deserialized.Id}, Message={deserialized.Message}");
    }
}

MemoryPack では Roslyn によるコード分析に対応しているため、なんとネイティブアプリ用の手動コード生成が不要になったらしい!

リアライザーの初期設定もそれにともなって消えた!すごい!

とりあえずこのコードを実行してシリアライズ→デシリアライズを試してみると・・・

ちゃんと復号化された

できた!これは MessagePack よりだいぶ進化してる・・・