LoginSignup
0
0

More than 5 years have passed since last update.

MsgPackの検証

Last updated at Posted at 2017-06-02

下記ソースだと
var serializer = MessagePackSerializer.Get(context); の行で
実機でAOTエラーになる。

■テストクラス

using System.IO;
using System.Collections;
using System.Collections.Generic;

using UnityEngine;

using MsgPack;
using MsgPack.Serialization;

public class test : MonoBehaviour {

    public class ABC
    {
        public int aaaaa;
        public int bbbbb;

    }

    // Use this for initialization
    void Start () {
        Debug.Log ("***********************");
        MessagePackSerializer.PrepareType<object> ();
        Debug.Log ("?????????????????????????");
    }


    public void OnClickButton()
    {
        Debug.Log ("0");
        var test = new ABC ();
        test.aaaaa = 0;
        test.bbbbb = 1;
        var stream = new MemoryStream();

        Debug.Log ("1");

        // --- シリアライズ
        var memoryStream = new MemoryStream();

        Debug.Log ("2");
        var context = new SerializationContext();
        context.SerializationMethod = SerializationMethod.Map;

        Debug.Log ("3");
        // シリアライズした結果をMemoryStreamに書き込み
        var serializer = MessagePackSerializer.Get<object>(context);
        Debug.Log ("4");
        serializer.Pack(memoryStream, test);

        Debug.Log ("abcde");
    }
}

■ライブラリ
Msgpack 0.8.1

■開発環境
Unity5.5.1f1
Xcode8.2

●実機
iPhone5se
iOS10.1

■パターン1:MessagePackSerializer.PrepareType (); をテストクラスに追記する

●結果:MessagePackSerializer.PrepareType (); でエラーになる。

void Start () 
{
    Debug.Log ("***********************");
    MessagePackSerializer.PrepareType<ABC> ();
    Debug.Log ("?????????????????????????");
}

■パターン2:MessagePackSerializer.PrepareType (); をテストクラスに追記する

●結果:エラーにならない

void Start () 
{
    Debug.Log ("***********************");
    MessagePackSerializer.PrepareType<int> ();
    Debug.Log ("?????????????????????????");
}

■パターン3:MessagePackSerializer.PrepareType (); をテストクラスに追記する

●結果:エラーにならない

void Start () 
{
    Debug.Log ("***********************");
    MessagePackSerializer.PrepareType<object> ();
    Debug.Log ("?????????????????????????");
}

■パターン4
 テストクラスを下記に変更。

 var serializer = MessagePackSerializer.Get<ABC>(context);
 ↓
 var serializer = MessagePackSerializer.Get<object>(context);

 serializer.Pack(memoryStream, test);の行で下記エラーが発生

 ExecutionEngineException: Attempting to call method 'MsgPack.Serialization.SerializationContext::GetSerializer' for which no ahead of time (AOT) code was generated.
at System.Reflection.MonoMethod.InternalInvoke (System.Object obj, System.Object[] parameters, System.Exception& exc) [0x00000] in :0

■パターン5
 テストクラスを下記に変更。

  serializer.Pack(memoryStream, test);
 ↓
 serializer.Pack(memoryStream, (object)test);

 serializer.Pack(memoryStream, (object)test);の行で下記エラーが発生

 ExecutionEngineException: Attempting to call method 'MsgPack.Serialization.SerializationContext::GetSerializer' for which no ahead of time (AOT) code was generated.
at System.Reflection.MonoMethod.InternalInvoke (System.Object obj, System.Object[] parameters, System.Exception& exc) [0x00000] in :0

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0