msgpack-cli
msgpack-cli copied to clipboard
About AOT Error at serialization By Unity
Serializing with the following sources, AOT error occurred on the actual machine, I am in trouble because I do not understand the solution method.
How do I fix it?
■Source Code
public byte[] Serialize(object data)
{
// --- シリアライズ
var memoryStream = new MemoryStream();
var context = new SerializationContext();
context.SerializationMethod = SerializationMethod.Map;
// シリアライズした結果をMemoryStreamに書き込み
var serializer = MessagePackSerializer.Get<object>(context);
serializer.Pack(memoryStream, data);
// バイト配列を取り出す
return memoryStream.ToArray();
}
■Source Description param object data is Class Instance
■Error line var serializer = MessagePackSerializer.Get
■Error
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 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context) [0x00000] in 1[T1].Invoke (.T1 handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in <filename unknown>:0 at UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction1 functor) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context) [0x00000] in 1[T1].Invoke (.T1 handler, UnityEngine.EventSystems.BaseEventData eventData) [0x00000] in <filename unknown>:0 at UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction1 functor) [0x00000] in
(Filename: currently not available on il2cpp Line: -1)
■Libralies Msgpack 0.8.0
■Enviroment ●Development environment Unity5.5.1p1 Xcode8.2
●Test environment iPhone5se iOS10.1
■extra use IL2CPP Run in Xcode as "Debug" Development build=ON
Sorry for delay.
It is hard to handle object in IL2CPP environment now. In general, you can avoid AOT error to call MessagePackSerializer.Prepare<T>() for each types used in your object tree.
Hello, I got same trouble, How do solution?
unity3d 5.4.5 msgpack version 0.9
About MessagePackSerializer.Prepare<T>()
var serializer = SerializationContext.Default.GetSerializer<T>(); byte[] data = serializer.PackSingleObject(o);
@tianwvf Would you show me actual error message and type?
@yfakariya I am sorry to have trouble but will you tell me a sample source?
Is it in front of line "MessagePackSerializer.Get" that describes "MessagePackSerializer.Prepare<T>() "?
1.Sample Code var serializer = SerializationContext.Default.GetSerializer(); byte[] data = serializer.PackSingleObject(o);
I seem , when my code decode contain some Array or like arr[] , or too long , it's have the error , Error like first msg:
Yes,
'MsgPack.Serialization.SerializationContext::GetSerializer.Get' for which no ahead of time (AOT) code was generated.
It's my Code . public T MpRead<T>(bool isShowLog = false) { var serializer = SerializationContext.Default.GetSerializer<T>(); // T newdata = serializer.UnpackSingleObject(msgData); return newdata; }
Hi, It's my Get Error information .
Error:
(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/UnityEngineDebugBindings.gen.cpp Line: 42)
ExecutionEngineException: Attempting to call method 'MsgPack.Serialization.SerializationContext::GetSerializer' for which no ahead of time (AOT) code was generated.
at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, SerializerCapabilities capabilities) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, SerializerCapabilities capabilities) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, SerializerCapabilities capabilities) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, SerializerCapabilities capabilities) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, SerializerCapabilities capabilities) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, SerializerCapabilities capabilities) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, SerializerCapabilities capabilities) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, SerializerCapabilities capabilities) [0x00000] in 1 members, MsgPack.Serialization.SerializationContext context, System.Func2[]& getters, System.Action2[]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <filename unknown>:0 at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, SerializerCapabilities capabilities) [0x00000] in
(Filename: currently not available on il2cpp Line: -1)
It's My Function: decode Data public T Read<T>() {
MessagePackSerializer<T> serializer = SerializationContext.Default.GetSerializer<T>();
//
T newdata = serializer.UnpackSingleObject(msgData);
return newdata;
}
@st0326s Yes. It is needed to tell IL2CPP compiler that the generic code for the type T is required.
@tianwvf Thank you! I see that your error was occurred of internal generic GetSerializer<T> code of msgpack for cli. It should be caused insufficient MessagePackSerializer.Prepare<T>() call. For example, you might forget call Prepare for "leaf" properties' type of your object tree.
@yfakariya Thank you Reply ! I don't know how to do solve The Error . I try to call
MessagePackSerializer.Prepare
so I publish ios run still The Error !
@tianwvf did you manage to solve it? I get a similar error when trying to build my Unity game for iOS:
ExecutionEngineException: Attempting to call method 'MsgPack.Serialization.SerializationContext::GetSerializer<System.Nullable`1[[System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]>' for which no ahead of time (AOT) code was generated.
at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <00000000000000000000000000000000>:0
at MsgPack.Serialization.ReflectionExtensions.InvokePreservingExceptionType (System.Reflection.MethodInfo source, System.Object instance, System.Object[] parameters) [0x00000] in <00000000000000000000000000000000>:0
at MsgPack.Serialization.SerializationContext+SerializerGetter.Get (MsgPack.Serialization.SerializationContext context, System.Type targetType, System.Object providerParameter) [0x00000] in <00000000000000000000000000000000>:0
at MsgPack.Serialization.SerializationContext.GetSerializer (System.Type targetType, System.Object providerParameter) [0x00000] in <00000000000000000000000000000000>:0
at MsgPack.Serialization.ReflectionSerializers.ReflectionSerializerHelper.GetMetadata (System.Type targetType, System.Collections.Generic.IList`1[T] members, MsgPack.Serialization.SerializationContext context, System.Func`2[System.Object,System.Object][]& getters, System.Action`2[System.Object,System.Object][]& setters, System.Reflection.MemberInfo[]& memberInfos, MsgPack.Serialization.DataMemberContract[]& contracts, MsgPack.Serialization.MessagePackSerializer[]& serializers) [0x00000] in <00000000000000000000000000000000>:0
at MsgPack.Serialization.ReflectionSerializers.ReflectionObjectMessagePackSerializer`1[T]..ctor (MsgPack.Serialization.SerializationContext context, MsgPack.Serialization.SerializationTarget target, MsgPack.Serialization.SerializerCapabilities capabilities) [0x00000] in <00000000000000000000000000000000>:0
at MsgPack.Serialization.MessagePackSerializer.CreateReflectionInternal[T] (MsgPack.Serialization.SerializationContext context, System.Type concreteType, MsgPack.Serialization.PolymorphismSchema schema) [0x00000] in <00000000000000000000000000000000>:0
at MsgPack.Serialization.SerializationContext.GetSerializer[T] (System.Object providerParameter) [0x00000] in <00000000000000000000000000000000>:0
at Game.MultiplayerMessageManager..cctor () [0x00000] in <00000000000000000000000000000000>:0
at LevelController.Start () [0x00000] in <00000000000000000000000000000000>:0
Okay, I've managed to solve it by calling MessagePackSerializer.PrepareType<T>() for all serialized types before MessagePackSerializer.Get
Like this:
MessagePackSerializer.PrepareType<string>();
MessagePackSerializer.PrepareType<MultiplayerMessageType>();
MessagePackSerializer.PrepareType<float>();
MessagePackSerializer.PrepareType<float?>();
///etc...
I suggest adding it to readme since this topic does not seem to be covered anywhere
@DataGreed You are right. I've added wiki and readme.