3

モノタッチでservicestackを使用してオブジェクトをシリアル化しようとしていますが、デバイスのAOTビルドを実行するときに、クラスを使用可能にする方法を一生理解できません。ビルドはシミュレーターで正常に機能します。私は最新バージョンのMonotouchと、今朝自分でプルして構築した最新バージョンのMonotouchServiceStackライブラリを持っています。

私がやろうとしているのは、汎用のToJson()を呼び出して、私のモデルオブジェクト(以下の注と呼ばれる)をシリアル化することです。すべてのWebサービスモデル/サービス呼び出し/シリアル化/逆シリアル化は、iPhoneおよびAndroidアプリの外部のクラスライブラリ内で発生します。このライブラリでは、JsConfig.RegisterForAot()およびJsConfig.RegisterTypeForAot()を呼び出そうとしています。助けません。両方の場所が必要かどうかわからないため、iPhoneアプリ内でこれらのメソッドも呼び出しています。

エラー/スタックトレース:

Attempting to JIT compile method 'ServiceStack.Text.Common.WriteListsOfElements`2<int, ServiceStack.Text.Json.JsonTypeSerializer>:WriteListValueType (System.IO.TextWriter,object)' while running with --aot-only. See http://docs.xamarin.com/ios/about/limitations for more information.


  at ServiceStack.Text.Common.WriteType`2[MyClassLibrary.Note,ServiceStack.Text.Json.JsonTypeSerializer].WriteProperties (System.IO.TextWriter writer, System.Object value) [0x00000] in <filename unknown>:0 
  at ServiceStack.Text.JsonSerializer.SerializeToString (System.Object value, System.Type type) [0x00000] in <filename unknown>:0 
  at ServiceStack.Text.JsonSerializer.SerializeToString[Object] (System.Object value) [0x00000] in <filename unknown>:0 
  at ServiceStack.Text.StringExtensions.ToJson[Object] (System.Object obj) [0x00000] in <filename unknown>:0 
  at MyClassLibrary.Utils.ObjectToJson (System.Object obj) [0x00000] in <filename unknown>:0 
  at MyClassLibrary.Utils.AddObjectToData (System.Net.WebRequest request, System.Object obj) [0x00000] in <filename unknown>:0 
  at MyClassLibrary.Utils.SendJsonRequest[Note] (System.String url, System.String httpVerb, MyClassLibrary.Note obj) [0x00000] in <filename unknown>:0 
  at MyClassLibrary.Note.JSONSave () [0x00000] in <filename unknown>:0 
  at iphoneapp.myViewController.SaveNote () [0x000a5] in /Users/myUser/Projects/iphoneapp/iphoneapp/ViewControllers/myViewController.cs:83 

Exact target/types:
ServiceStack.Text.Common.WriteType`2[[MyClassLibrary.Note, MyClassLibraryName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[ServiceStack.Text.Json.JsonTypeSerializer, ServiceStack.Text.MonoTouch, Version=3.8.5.0, Culture=neutral, PublicKeyToken=null]]

どんな助けでもいただければ幸いです。

4

3 に答える 3

5

私はこれらの問題のいくつかに遭遇しました、そして問題は通常私のDTOプロパティのいくつかで列挙型の使用に帰着しました。

あなたがする必要があるのは、AOTコンパイラーのために明示的に各列挙型の汎用シリアライザーの初期化を強制することです。これを行う方法は、AppDelegate.FinishedLaunchingコードでダミーのシリアライザーの束を作成することです(私はそれらに対して何もしません)。

// AOT register enums that are involved in service DTOs
var dummy1 = new JsonSerializer<MyEnum>();
var dummy2 = new JsonSerializer<MyOtherEnum>();

JSON側のみを使用している場合は、上記のアプローチである程度の成功を収める必要があります。

リストを単一の文字列プロパティにシリアル化する場合があるので、上記と同じ方法でJsvSerialiserも初期化します。

重要なのは、コード内の列挙型のシリアライザーを明示的に作成することです。これにより、AOTコンパイラーが何かを見つけて事前にコンパイルできるようになります。

于 2012-09-20T07:01:46.273 に答える
1

多分WriteListsOfElements2<int, ServiceStack.Text.Json.JsonTypeSerializer>手がかりです。おそらく、整数のリストについてPaul DBが提案したように、ダミーを作成する必要があります。

于 2012-09-20T16:01:58.017 に答える
0
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
        // this is required for MT AOT compiler
        JsConfig.RegisterTypeForAot<YourEnumHere>();

..。

Xamarin.iOSの最新バージョンでは、これはもう必要ないことがわかりました。

于 2014-02-26T11:41:05.503 に答える