4

まず、protobuf-net http://code.google.com/p/protobuf-net/の作成者である Marc Gravell に大いに感謝し ます。本当に素晴らしいリソースです。とにかく、マークまたは他の誰かがこの例外を解決するのを手伝ってくれることを願っています.

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 は、iOS や Android アプリに最適な、素晴らしく軽量なシリアライゼーションおよび RPC ワイヤ プロトコルであると思われるので、使用することを楽しみにしています。

4

2 に答える 2

4

v1 には、pre-JIT を少し面倒にする問題がいくつかあります。v2 は不完全ではありますが、これらの問題の多く/すべてを解決することを目的としており、少なくとも dll オプションへのプリコンパイルを提供することにより、ランタイムのみのバージョンでさえ、はるかにデバイス フレンドリーになるはずです。

また、Java バージョンの Jon のポートは、ランタイムよりもコンパイラに重点を置いているため、ここでうまく機能するはずです。

于 2011-02-23T23:31:13.067 に答える