Primero muchas gracias a Marc Gravell autor de protobuf-net http://code.google.com/p/protobuf-net/ . Es un gran recurso. De todos modos, espero que Marc o alguien más pueda ayudarme a resolver esta excepción.
Estoy tratando de implementar protobuf-net en dispositivos móviles (iOS y Android) usando el motor de juegos Unity3D. Unity 3.2 usa Mono 2.6, su versión ligeramente modificada de mono.
Funciona bien en el Editor, pero en el dispositivo iOS en tiempo de ejecución falla en el primer miembro que intenta serializar. Tenga en cuenta el indicador --aot-only en la excepción. Creo que Unity básicamente construye el ensamblaje ARM a través de la característica aot de Mono, aunque no entiendo qué está haciendo debajo del capó.
ExecutionEngineException: Attempting to JIT compile method 'ProtoBuf.Property.Property`2<GameManagerSaveState , bool>:.ctor ()' while running with --aot-only. at ProtoBuf.Property.PropertyBoolean`1[GameManagerSaveState]..ctor () [0x00000] in <filename unknown>:0 at ProtoBuf.Property.PropertyFactory.CreateProperty[GameManagerSaveState] (System.Type type, ProtoBuf.DataFormat& format, MemberSerializationOptions options) [0x00000] in <filename unknown>:0 at ProtoBuf.Property.PropertyFactory.Create[GameManagerSaveState] (System.Reflection.MemberInfo member) [0x00000] in <filename unknown>:0 at ProtoBuf.Serializer`1[GameManagerSaveState].Build () [0x00000] in <filename unknown>:0Se sugirió en IRC que podría declarar variables de este tipo con anticipación, que el compilador no tendría que JIT en tiempo de ejecución. Parece una gran idea, pero desafortunadamente estos son como tipos genéricos internos y no saben qué escribir en C# para declarar variables con el fin de falsificar el compilador. ¿Alguien puede interpretar el mensaje anterior y decirme qué necesita saber el compilador con anticipación? ¿Alguna otra estrategia para evitar que esto suceda? Por cierto, aquí está la parte superior de la clase donde está fallando
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; using ProtoBuf; [ProtoContract] public class GameManagerSaveState { [ProtoMember(1)] public bool gameOver; // snip¡Gracias a los expertos de Mono y protobuf por ayudarme a lograrlo! protobuf-net parece ser una serialización increíble y liviana y un protocolo de conexión RPC que sería perfecto para las aplicaciones de iOS y Android, así que estoy ansioso por usarlo.
Hay una serie de problemas en v1 que hacen que sea un poco molesto para pre-JIT; v2, aunque incompleto, pretende resolver muchos/todos estos problemas, sobre todo ofreciendo una opción de compilación previa a dll, pero incluso la versión de solo tiempo de ejecución debería ser mucho más compatible con dispositivos.
También debo mencionar que el puerto de Jon de la versión de Java debería funcionar bien aquí, ya que es un compilador pesado en lugar de un tiempo de ejecución pesado.
Use esto antes de usar protobuf:
Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");Crédito: https://github.com/antonholmquist/easy-serializer-unity