Protobuf-net Попытка использования метода компиляции JIT (динамический метод-обертка) ClassExtensions.StringArray

1

Unity3d protobuf-net для сериализации. Я предварительно компилирую свой RuntimeTypeModel, а затем загружаю его и использую для сериализации.

В iOS я все еще получаю следующую ошибку:

ExecutionEngineException: Attempting to JIT compile method '(wrapper dynamic-method) ClassExtensions.StringArray:proto_3 (object,ProtoBuf.ProtoWriter)' while running with --aot-only.

  at System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) [0x00000] in <filename unknown>:0 
  at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) [0x00000] in <filename unknown>:0 
  at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method) [0x00000] in <filename unknown>:0 
  at System.Reflection.Emit.DynamicMethod.CreateDelegate (System.Type delegateType) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Compiler.CompilerContext.BuildSerializer (IProtoSerializer head, ProtoBuf.Meta.TypeModel model) [0x00000] in <filename unknown>:0 
Rethrow as InvalidOperationException: It was not possible to prepare a serializer for: ClassExtensions.StringArray
  at ProtoBuf.Compiler.CompilerContext.BuildSerializer (IProtoSerializer head, ProtoBuf.Meta.TypeModel model) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Serializers.CompiledSerializer..ctor (IProtoTypeSerializer head, ProtoBuf.Meta.TypeModel model) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Serializers.CompiledSerializer.Wrap (IProtoTypeSerializer head, ProtoBuf.Meta.TypeModel model) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Meta.MetaType.CompileInPlace () [0x00000] in <filename unknown>:0 
  at ProtoBuf.Meta.MetaType.get_Serializer () [0x00000] in <filename unknown>:0 
  at ProtoBuf.Meta.RuntimeTypeModel.Serialize (Int32 key, System.Object value, ProtoBuf.ProtoWriter dest) [0x00000] in <filename unknown>:0 
  at ProtoBuf.ProtoWriter.WriteObject (System.Object value, Int32 key, ProtoBuf.ProtoWriter writer) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Serializers.SubItemSerializer.ProtoBuf.Serializers.IProtoSerializer.Write (System.Object value, ProtoBuf.ProtoWriter dest) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Serializers.TagDecorator.Write (System.Object value, ProtoBuf.ProtoWriter dest) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Serializers.ListDecorator.Write (System.Object value, ProtoBuf.ProtoWriter dest) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Serializers.FieldDecorator.Write (System.Object value, ProtoBuf.ProtoWriter dest) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Serializers.TypeSerializer.Write (System.Object value, ProtoBuf.ProtoWriter dest) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Meta.RuntimeTypeModel.Serialize (Int32 key, System.Object value, ProtoBuf.ProtoWriter dest) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Meta.TypeModel.SerializeCore (ProtoBuf.ProtoWriter writer, System.Object value) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Meta.TypeModel.Serialize (System.IO.Stream dest, System.Object value, ProtoBuf.SerializationContext context) [0x00000] in <filename unknown>:0 
  at ProtoBuf.Meta.TypeModel.Serialize (System.IO.Stream dest, System.Object value) [0x00000] in <filename unknown>:0 
  at RouterConfig.Save (System.String configFileName) [0x00000] in <filename unknown>:0 
  at RouterConfig.SaveRun () [0x00000] in <filename unknown>:0 
  at Console.Update () [0x00000] in <filename unknown>:0 

Вот мой класс:

using ProtoBuf;

namespace ClassExtensions
{
    //this class will allow use to Serialize a List<StringArray>
    [ProtoContract]
    public class StringArray
    {
        [ProtoMember(1)] public string[] items { get; set; }
        public StringArray() {}
        public StringArray(string[] c) {this.items = c;}
        //conversion from string[] to StringArray 
        public static implicit operator StringArray(string[] a)
        { return new StringArray(a); }
        //conversion from StringArray to string[] 
        public static implicit operator string[](StringArray a)
        { return a.items; }
        //conversion from StringArray to string[] 


        public static string[][] ConvertToStringDoubleArray(List<StringArray> a)
        {
            List<string[]> b = new List<string[]>();
            foreach(StringArray c in a)
                b.Add(c.items);
            return b.ToArray();
        }
        //used to allow indexing...
        public string this[int i]
        {
            get { return this.items[i]; }
            set { this.items[i] = value; }
        }
    }
}

Компиляция в DLL:

RuntimeTypeModel rModel = TypeModel.Create();

rModel.AllowParseableTypes = true;
rModel.AutoAddMissingTypes = true;

rModel.Add(typeof(StringArray), true);

rModel.Compile("MySerializer", "MySerializer.dll");

Основываясь на моих исследованиях, это должно работать. Я что-то упустил?

Теги:
unity3d
serialization
protobuf-net

1 ответ

2

Догадаться. Проблема в том, что, хотя я предварительно скомпилировал его, protobuf попытался скомпилировать снова. Добавление этой строки в код исправляет ее.

rModel.AutoCompile = false;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню