首先非常感谢 protobuf-net http://code.google.com/p/protobuf-net/的作者 Marc Gravell 。这真是一个很棒的资源。无论如何,我希望 Marc 或其他人可以帮助我解决这个异常。
我正在尝试使用 Unity3D 游戏引擎在移动设备(iOS 和 Android)上实现 protobuf-net。Unity 3.2 使用 Mono 2.6,这是对 mono 的略微修改版本。
它在编辑器中运行良好,但在 iOS 设备上运行时它在它尝试序列化的第一个成员处失败。请注意异常中的 --aot-only 标志。我认为 Unity 基本上是通过 Mono 的 aot 功能构建 ARM 程序集,尽管我不明白它在后台做什么。
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>:0
IRC 上有人建议我可以提前声明这些类型的变量,编译器不必在运行时对它们进行 JIT。似乎是个好主意,但不幸的是,这些就像内部泛型类型,并且不知道在 C# 中编写什么来声明变量以伪造编译器。任何人都可以解释上述消息并让我知道编译器需要提前知道什么吗?还有其他防止这种情况发生的策略吗?顺便说一句,这是错误的类的顶部
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using ProtoBuf;
[ProtoContract]
public class GameManagerSaveState
{
[ProtoMember(1)]
public bool gameOver;
// snip
感谢 Mono 和 protobuf 专家帮助我解决这个问题!protobuf-net 似乎是一个很棒的轻量级序列化和 RPC 有线协议,非常适合 iOS 和 Android 应用程序,所以我期待使用它。