4

首先非常感谢 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 应用程序,所以我期待使用它。

4

2 回答 2

4

v1 中有许多问题使得 pre-JIT 有点痛苦;v2 虽然不完整,但旨在解决许多/所有这些问题,尤其是通过提供预编译到 dll 选项 - 但即使是仅运行时版本也应该对设备更加友好。

我还应该提到,Jon 的 Java 版本移植在这里应该可以很好地工作,因为它是编译器繁重的而不是运行时繁重的。

于 2011-02-23T23:31:13.067 回答
1

在使用 protobuf 之前使用它:

Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");

信用: https ://github.com/antonholmquist/easy-serializer-unity

于 2015-03-28T20:52:49.423 回答