下記ソースだと
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