MessagePack-CSharp　Array型　メモ

※Windows機が必須

１：最新のリリースビルドを落として来る
https://github.com/neuecc/MessagePack-CSharp/releases

２：解凍して任意の場所に置く

３：新規Unityプロジェクトを作る。

４：メニューバーからAssets->import package->Custom Package　を選択し、
　　２：で解凍したパッケージを選択してインポートする。

![UnityPackage_import01.png](https://qiita-image-store.s3.amazonaws.com/0/17904/6fd1fecc-9160-b37f-d5af-ab11c613eef2.png)

↓↓↓↓

![UnityPackage_import02.png](https://qiita-image-store.s3.amazonaws.com/0/17904/55ff6fc2-b7c7-5b16-68cf-495846640b22.png)

↓↓↓↓

![UnityPackage_import01.png](https://qiita-image-store.s3.amazonaws.com/0/17904/ba921622-123e-4eb0-e736-d8f7ac56b9af.png)

５：下記テストクラスを作成

　クラスの属性に[MessagePackObject]をつけて、各変数名に[Key(XX)]という属性をつける。
　Key属性につけるインデックスは０から順番に振る。

```
using System.Collections.Generic;
using System.Text;
using MessagePack;


[MessagePackObject]
public class SubClass
{
    [Key(0)]
    public int acb;
    [Key(1)]
    public StringBuilder def;
}

[MessagePackObject]
public class TestClass
{

    [Key(0)]
    public int aaa;
    [Key(1)]
    public long bbb;
    [Key(2)]
    public float ccc;
    [Key(3)]
    public double ddd;
    [Key(4)]
    public StringBuilder eee = new StringBuilder();
    [Key(5)]
    public int[] fff = new int[] { 1, 3, 5, 7, 9 };
    [Key(6)]
    public StringBuilder[] ggg = new StringBuilder[5];
    [Key(7)]
    public List<int> hhh = new List<int>();
    [Key(8)]
    public List<StringBuilder> iii = new List<StringBuilder>();
    [Key(9)]
    public Dictionary<int, StringBuilder> jjj = new Dictionary<int, StringBuilder>();
    [Key(10)]
    public Dictionary<StringBuilder, StringBuilder> kkk = new Dictionary<StringBuilder, StringBuilder>();
    [Key(11)]
    public List<SubClass> lll = new List<SubClass>();
    [Key(12)]
    public Dictionary<StringBuilder, SubClass> mmm = new Dictionary<StringBuilder, SubClass>();
    [Key(13)]
    public List<List<SubClass>> nnn = new List<List<SubClass>>();
    [Key(14)]
    public Dictionary<StringBuilder, List<SubClass>> ooo = new Dictionary<StringBuilder, List<SubClass>>();
}
```

　６．コマンドプロンプト Or PowerShell を開く

　７．２．で解凍したフォルダ内のToolsフォルダ内へcdコマンドで移動する。
　　
　８．mpc.exeを使用して、下記コマンドを入力しジェネレートする。

```
.\mpc.exe -i 指定プロジェクトのプロジェクトファイルのパス(*.csproj) -o 指定プロジェクトの任意の名前のクラス名（フルパス）※仮にMessagePackGenerated.csとする。

例：）
.\mpc.exe -i 自分PCドキュメントフォルダ\MessagePack_CSharp_Sample_Various_Type\MessagePack_CSharp_Sample_Various_Type.csproj -o 自分PCドキュメントフォルダ\MessagePack_CSharp_Sample_Various_\Assets\Scripts\GenerateArray.cs
```

　９．下記クラスが作成される。
　 　　※コンパイルエラーになるが、名前空間のエラーなので任意のもの入力して修正する。

```
#pragma warning disable 618
#pragma warning disable 612
#pragma warning disable 414
#pragma warning disable 168

namespace MessagePack.Resolvers
{
    using System;
    using MessagePack;

    public class GeneratedResolver : global::MessagePack.IFormatterResolver
    {
        public static readonly global::MessagePack.IFormatterResolver Instance = new GeneratedResolver();

        GeneratedResolver()
        {

        }

        public global::MessagePack.Formatters.IMessagePackFormatter<T> GetFormatter<T>()
        {
            return FormatterCache<T>.formatter;
        }

        static class FormatterCache<T>
        {
            public static readonly global::MessagePack.Formatters.IMessagePackFormatter<T> formatter;

            static FormatterCache()
            {
                var f = GeneratedResolverGetFormatterHelper.GetFormatter(typeof(T));
                if (f != null)
                {
                    formatter = (global::MessagePack.Formatters.IMessagePackFormatter<T>)f;
                }
            }
        }
    }

    internal static class GeneratedResolverGetFormatterHelper
    {
        static readonly global::System.Collections.Generic.Dictionary<Type, int> lookup;

        static GeneratedResolverGetFormatterHelper()
        {
            lookup = new global::System.Collections.Generic.Dictionary<Type, int>(11)
            {
                {typeof(global::System.Text.StringBuilder[]), 0 },
                {typeof(global::System.Collections.Generic.List<int>), 1 },
                {typeof(global::System.Collections.Generic.List<global::System.Text.StringBuilder>), 2 },
                {typeof(global::System.Collections.Generic.Dictionary<int, global::System.Text.StringBuilder>), 3 },
                {typeof(global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::System.Text.StringBuilder>), 4 },
                {typeof(global::System.Collections.Generic.List<global::SubClass>), 5 },
                {typeof(global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::SubClass>), 6 },
                {typeof(global::System.Collections.Generic.List<global::System.Collections.Generic.List<global::SubClass>>), 7 },
                {typeof(global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::System.Collections.Generic.List<global::SubClass>>), 8 },
                {typeof(global::SubClass), 9 },
                {typeof(global::TestClass), 10 },
            };
        }

        internal static object GetFormatter(Type t)
        {
            int key;
            if (!lookup.TryGetValue(t, out key)) return null;

            switch (key)
            {
                case 0: return new global::MessagePack.Formatters.ArrayFormatter<global::System.Text.StringBuilder>();
                case 1: return new global::MessagePack.Formatters.ListFormatter<int>();
                case 2: return new global::MessagePack.Formatters.ListFormatter<global::System.Text.StringBuilder>();
                case 3: return new global::MessagePack.Formatters.DictionaryFormatter<int, global::System.Text.StringBuilder>();
                case 4: return new global::MessagePack.Formatters.DictionaryFormatter<global::System.Text.StringBuilder, global::System.Text.StringBuilder>();
                case 5: return new global::MessagePack.Formatters.ListFormatter<global::SubClass>();
                case 6: return new global::MessagePack.Formatters.DictionaryFormatter<global::System.Text.StringBuilder, global::SubClass>();
                case 7: return new global::MessagePack.Formatters.ListFormatter<global::System.Collections.Generic.List<global::SubClass>>();
                case 8: return new global::MessagePack.Formatters.DictionaryFormatter<global::System.Text.StringBuilder, global::System.Collections.Generic.List<global::SubClass>>();
                case 9: return new MessagePack.Formatters.SubClassFormatter();
                case 10: return new MessagePack.Formatters.TestClassFormatter();
                default: return null;
            }
        }
    }
}

#pragma warning disable 168
#pragma warning restore 414
#pragma warning restore 618
#pragma warning restore 612



#pragma warning disable 618
#pragma warning disable 612
#pragma warning disable 414
#pragma warning disable 168

namespace MessagePack.Formatters
{
    using System;
    using MessagePack;


    public sealed class SubClassFormatter : global::MessagePack.Formatters.IMessagePackFormatter<global::SubClass>
    {

        public int Serialize(ref byte[] bytes, int offset, global::SubClass value, global::MessagePack.IFormatterResolver formatterResolver)
        {
            if (value == null)
            {
                return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset);
            }
            
            var startOffset = offset;
            offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 2);
            offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.acb);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Text.StringBuilder>().Serialize(ref bytes, offset, value.def, formatterResolver);
            return offset - startOffset;
        }

        public global::SubClass Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize)
        {
            if (global::MessagePack.MessagePackBinary.IsNil(bytes, offset))
            {
                readSize = 1;
                return null;
            }

            var startOffset = offset;
            var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize);
            offset += readSize;

            var __acb__ = default(int);
            var __def__ = default(global::System.Text.StringBuilder);

            for (int i = 0; i < length; i++)
            {
                var key = i;

                switch (key)
                {
                    case 0:
                        __acb__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize);
                        break;
                    case 1:
                        __def__ = formatterResolver.GetFormatterWithVerify<global::System.Text.StringBuilder>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    default:
                        readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset);
                        break;
                }
                offset += readSize;
            }

            readSize = offset - startOffset;

            var ____result = new global::SubClass();
            ____result.acb = __acb__;
            ____result.def = __def__;
            return ____result;
        }
    }


    public sealed class TestClassFormatter : global::MessagePack.Formatters.IMessagePackFormatter<global::TestClass>
    {

        public int Serialize(ref byte[] bytes, int offset, global::TestClass value, global::MessagePack.IFormatterResolver formatterResolver)
        {
            if (value == null)
            {
                return global::MessagePack.MessagePackBinary.WriteNil(ref bytes, offset);
            }
            
            var startOffset = offset;
            offset += global::MessagePack.MessagePackBinary.WriteFixedArrayHeaderUnsafe(ref bytes, offset, 15);
            offset += MessagePackBinary.WriteInt32(ref bytes, offset, value.aaa);
            offset += MessagePackBinary.WriteInt64(ref bytes, offset, value.bbb);
            offset += MessagePackBinary.WriteSingle(ref bytes, offset, value.ccc);
            offset += MessagePackBinary.WriteDouble(ref bytes, offset, value.ddd);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Text.StringBuilder>().Serialize(ref bytes, offset, value.eee, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<int[]>().Serialize(ref bytes, offset, value.fff, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Text.StringBuilder[]>().Serialize(ref bytes, offset, value.ggg, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.List<int>>().Serialize(ref bytes, offset, value.hhh, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.List<global::System.Text.StringBuilder>>().Serialize(ref bytes, offset, value.iii, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<int, global::System.Text.StringBuilder>>().Serialize(ref bytes, offset, value.jjj, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::System.Text.StringBuilder>>().Serialize(ref bytes, offset, value.kkk, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.List<global::SubClass>>().Serialize(ref bytes, offset, value.lll, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::SubClass>>().Serialize(ref bytes, offset, value.mmm, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.List<global::System.Collections.Generic.List<global::SubClass>>>().Serialize(ref bytes, offset, value.nnn, formatterResolver);
            offset += formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::System.Collections.Generic.List<global::SubClass>>>().Serialize(ref bytes, offset, value.ooo, formatterResolver);
            return offset - startOffset;
        }

        public global::TestClass Deserialize(byte[] bytes, int offset, global::MessagePack.IFormatterResolver formatterResolver, out int readSize)
        {
            if (global::MessagePack.MessagePackBinary.IsNil(bytes, offset))
            {
                readSize = 1;
                return null;
            }

            var startOffset = offset;
            var length = global::MessagePack.MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize);
            offset += readSize;

            var __aaa__ = default(int);
            var __bbb__ = default(long);
            var __ccc__ = default(float);
            var __ddd__ = default(double);
            var __eee__ = default(global::System.Text.StringBuilder);
            var __fff__ = default(int[]);
            var __ggg__ = default(global::System.Text.StringBuilder[]);
            var __hhh__ = default(global::System.Collections.Generic.List<int>);
            var __iii__ = default(global::System.Collections.Generic.List<global::System.Text.StringBuilder>);
            var __jjj__ = default(global::System.Collections.Generic.Dictionary<int, global::System.Text.StringBuilder>);
            var __kkk__ = default(global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::System.Text.StringBuilder>);
            var __lll__ = default(global::System.Collections.Generic.List<global::SubClass>);
            var __mmm__ = default(global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::SubClass>);
            var __nnn__ = default(global::System.Collections.Generic.List<global::System.Collections.Generic.List<global::SubClass>>);
            var __ooo__ = default(global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::System.Collections.Generic.List<global::SubClass>>);

            for (int i = 0; i < length; i++)
            {
                var key = i;

                switch (key)
                {
                    case 0:
                        __aaa__ = MessagePackBinary.ReadInt32(bytes, offset, out readSize);
                        break;
                    case 1:
                        __bbb__ = MessagePackBinary.ReadInt64(bytes, offset, out readSize);
                        break;
                    case 2:
                        __ccc__ = MessagePackBinary.ReadSingle(bytes, offset, out readSize);
                        break;
                    case 3:
                        __ddd__ = MessagePackBinary.ReadDouble(bytes, offset, out readSize);
                        break;
                    case 4:
                        __eee__ = formatterResolver.GetFormatterWithVerify<global::System.Text.StringBuilder>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 5:
                        __fff__ = formatterResolver.GetFormatterWithVerify<int[]>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 6:
                        __ggg__ = formatterResolver.GetFormatterWithVerify<global::System.Text.StringBuilder[]>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 7:
                        __hhh__ = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.List<int>>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 8:
                        __iii__ = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.List<global::System.Text.StringBuilder>>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 9:
                        __jjj__ = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<int, global::System.Text.StringBuilder>>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 10:
                        __kkk__ = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::System.Text.StringBuilder>>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 11:
                        __lll__ = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.List<global::SubClass>>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 12:
                        __mmm__ = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::SubClass>>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 13:
                        __nnn__ = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.List<global::System.Collections.Generic.List<global::SubClass>>>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    case 14:
                        __ooo__ = formatterResolver.GetFormatterWithVerify<global::System.Collections.Generic.Dictionary<global::System.Text.StringBuilder, global::System.Collections.Generic.List<global::SubClass>>>().Deserialize(bytes, offset, formatterResolver, out readSize);
                        break;
                    default:
                        readSize = global::MessagePack.MessagePackBinary.ReadNextBlock(bytes, offset);
                        break;
                }
                offset += readSize;
            }

            readSize = offset - startOffset;

            var ____result = new global::TestClass();
            ____result.aaa = __aaa__;
            ____result.bbb = __bbb__;
            ____result.ccc = __ccc__;
            ____result.ddd = __ddd__;
            ____result.eee = __eee__;
            ____result.fff = __fff__;
            ____result.ggg = __ggg__;
            ____result.hhh = __hhh__;
            ____result.iii = __iii__;
            ____result.jjj = __jjj__;
            ____result.kkk = __kkk__;
            ____result.lll = __lll__;
            ____result.mmm = __mmm__;
            ____result.nnn = __nnn__;
            ____result.ooo = __ooo__;
            return ____result;
        }
    }

}

#pragma warning disable 168
#pragma warning restore 414
#pragma warning restore 618
#pragma warning restore 612

```

　１０．下記のようなテストクラスを記述し、実機上でシリアライズ・デシリアライズできる事を確認
　　　　初めに、MessagePack.Resolvers.CompositeResolver.RegisterAndSetAsDefault　
　　　　によってリゾルバーを登録する事
　　　　
　　　　**登録は必ずStartに書く事**
　　　　下記のようなエラーが出る為
　　　　Register must call on startup(before use GetFormatter<T>).

　　　　シリアライズ時、MessagePack.MessagePackSerializer.Serialize(multi, MessagePack.Resolvers.CompositeResolver.Instance);　
　　　　の部分は第２引数がなくても良い


```
using System.Text;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArrayTest : MonoBehaviour {

	// Use this for initialization
	void Start () {
        // カスタムリゾルバーを登録する。
        // CompositeResolver is singleton helper for use custom resolver.
        // Ofcourse you can also make custom resolver.
        MessagePack.Resolvers.CompositeResolver.RegisterAndSetAsDefault
        (
            // use generated resolver first, and combine many other generated/custom resolvers
            MessagePack.Resolvers.GeneratedResolver.Instance,

            // finally, use builtin/primitive resolver(don't use StandardResolver, it includes dynamic generation)
            MessagePack.Resolvers.BuiltinResolver.Instance,
            MessagePack.Resolvers.PrimitiveObjectResolver.Instance
        );
    }
	


    public void ArrayTypeSelialize()
    {
        Debug.Log("OnClickButton");
        var multi = new TestClass();

        //*******************************************************
        Debug.Log("0");
        multi.aaa = 123;
        //*******************************************************
        Debug.Log("1");
        multi.bbb = 234;
        //*******************************************************
        Debug.Log("2");
        multi.ccc = 345.6f;
        //*******************************************************
        Debug.Log("3");
        multi.ddd = 456.789d;
        //*******************************************************
        Debug.Log("4");
        multi.eee = multi.eee.Append("あいうえおかきくけこ");
        //*******************************************************
        Debug.Log("5");
        multi.fff[0] = 999;
        //*******************************************************
        Debug.Log("6");
        multi.ggg[1] = new System.Text.StringBuilder();
        multi.ggg[1].Append("さしすせそ");
        //*******************************************************
        Debug.Log("7");
        multi.hhh.Add(12);
        multi.hhh.Add(34);
        multi.hhh.Add(56);
        //*******************************************************
        Debug.Log("8");
        var sb1 = new System.Text.StringBuilder();
        sb1.Append("たちつてと");
        multi.iii.Add(sb1);
        var sb2 = new System.Text.StringBuilder();
        sb2.Append("なにぬねの");
        multi.iii.Add(sb2);
        var sb3 = new System.Text.StringBuilder();
        sb3.Append("はひふへほ");
        multi.iii.Add(sb3);


        //*******************************************************
        Debug.Log("9");
        var sb4 = new System.Text.StringBuilder();
        sb4.Append("ああああ");
        multi.jjj.Add(0, sb4);
        var sb5 = new System.Text.StringBuilder();
        sb5.Append("いいいい");
        multi.jjj.Add(1, sb5);
        var sb6 = new System.Text.StringBuilder();
        sb6.Append("うううう");
        multi.jjj.Add(2, sb6);


        //*******************************************************
        Debug.Log("10");

        var sb7 = new System.Text.StringBuilder();
        var sb8 = new System.Text.StringBuilder();
        var sb9 = new System.Text.StringBuilder();
        var sb10 = new System.Text.StringBuilder();
        var sb11 = new System.Text.StringBuilder();
        var sb12 = new System.Text.StringBuilder();

        sb7.Append("あ");
        sb8.Append("い");
        sb9.Append("う");
        sb10.Append("え");
        sb11.Append("お");
        sb12.Append("か");

        multi.kkk.Add(sb7, sb8);
        multi.kkk.Add(sb9, sb10);
        multi.kkk.Add(sb11, sb12);

        //*******************************************************
        Debug.Log("11");
        var parts1 = new SubClass();
        parts1.acb = 123;
        parts1.def = new System.Text.StringBuilder();
        parts1.def.Append("あいうえお");
        multi.lll.Add(parts1);

        var parts2 = new SubClass();
        parts2.acb = 234;
        parts2.def = new System.Text.StringBuilder();
        parts2.def.Append("かきくけこ");
        multi.lll.Add(parts2);

        //*******************************************************
        Debug.Log("12");
        var parts3 = new SubClass();
        parts3.acb = 345;
        parts3.def = new System.Text.StringBuilder();
        parts3.def.Append("さしすせそ");

        var sb13 = new System.Text.StringBuilder();
        sb13.Append("aaa");
        multi.mmm.Add(sb13, parts3);

        var parts4 = new SubClass();
        parts4.acb = 456;
        parts4.def = new System.Text.StringBuilder();
        parts4.def.Append("たちつてと");
        var sb14 = new System.Text.StringBuilder();
        sb14.Append("bbb");
        multi.mmm.Add(sb14, parts4);

        //*******************************************************
        Debug.Log("13");
        List<SubClass> listTest1 = new List<SubClass>();
        var parts5 = new SubClass();
        parts5.acb = 456;
        parts5.def = new System.Text.StringBuilder();
        parts5.def.Append("たちつてと");
        listTest1.Add(parts5);

        var parts6 = new SubClass();
        parts6.acb = 567;
        parts6.def = new System.Text.StringBuilder();
        parts6.def.Append("なにぬねの");
        listTest1.Add(parts6);

        multi.nnn.Add(listTest1);

        List<SubClass> listTest2 = new List<SubClass>();
        var parts7 = new SubClass();
        parts7.acb = 456;
        parts7.def = new System.Text.StringBuilder();
        parts7.def.Append("たちつてと");
        listTest2.Add(parts7);

        var parts8 = new SubClass();
        parts8.acb = 567;
        parts8.def = new System.Text.StringBuilder();
        parts8.def.Append("なにぬねの");
        listTest2.Add(parts8);

        multi.nnn.Add(listTest2);

        //*******************************************************
        Debug.Log("14");
        List<SubClass> listTest3 = new List<SubClass>();
        var parts9 = new SubClass();
        parts9.acb = 456;
        parts9.def = new System.Text.StringBuilder();
        parts9.def.Append("たちつてと");
        listTest3.Add(parts9);

        var parts10 = new SubClass();
        parts10.acb = 567;
        parts10.def = new System.Text.StringBuilder();
        parts10.def.Append("なにぬねの");
        listTest3.Add(parts10);

        var sb15 = new System.Text.StringBuilder();
        sb15.Append("aaa");
        multi.ooo.Add(sb15, listTest3);

        List<SubClass> listTest4 = new List<SubClass>();
        var parts11 = new SubClass();
        parts11.acb = 456;
        parts11.def = new System.Text.StringBuilder();
        parts11.def.Append("たちつてと");
        listTest4.Add(parts11);

        var parts12 = new SubClass();
        parts12.acb = 567;
        parts12.def = new System.Text.StringBuilder();
        parts12.def.Append("なにぬねの");
        listTest3.Add(parts12);

        var sb16 = new System.Text.StringBuilder();
        sb16.Append("bbb");
        multi.ooo.Add(sb16, listTest4);

        Debug.Log("000000000000000000000000");
        MessagePack.MessagePackSerializer.Serialize<TestClass>(multi, MessagePack.Resolvers.CompositeResolver.Instance);
        Debug.Log("111111111111111111111111");

    }

}

```