尝试在Monotouch上使用ServiceStack序列化自定义对象时出现AOT编译错误

时间:2012-09-19 16:28:15

标签: json rest xamarin.ios servicestack

我正在尝试使用servicestack在monotouch中序列化一个对象,但我无法在生活中找出如何在为设备进行AOT构建时使类可用。构建适用于模拟器。我有Monotouch的最新版本,以及Monotouch ServiceStack库的最新版本,我今天早上自己拉出并构建了它。

我要做的是调用泛型ToJson()来序列化我的模型对象(下面称为Note)。我的所有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]]

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分: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编译器可以提前查找和编译。

答案 1 :(得分:1)

也许WriteListsOfElements2<int, ServiceStack.Text.Json.JsonTypeSerializer>是一个线索。也许您需要按照Paul DB的建议创建一个虚拟整数列表。

答案 2 :(得分:0)

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
    {
        // this is required for MT AOT compiler
        JsConfig.RegisterTypeForAot<YourEnumHere>();

...

使用最新版本的Xamarin.iOS,我发现不再需要这个了。