1

完全なリンクでアプリケーションを動作させるのに問題があります。これは私のセットアップです(アセンブリ名が変更されました):

  • Android 4.4.54 のモノ
  • Android アプリケーション ( MyApp )
  • プラットフォームに依存しないライブラリ ( MyLib )

ServiceStack.Text を使用して、JSON テキストから型 (Person) を逆シリアル化しようとしています。SDK アセンブリのみをリンクする場合は問題なく動作します。

リンカー インクルード属性をMyLibに配置するのではなく、 MyAppでLinkDescription XML ファイルを使用しています。次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<linker>
  <assembly fullname="MyLib">
    <type fullname="MyLib.Person" preserve="fields">
      <method name=".ctor" />
    </type>
  </assembly>
</linker>

これは私のlogcat出力です:

E/MyApp(14494): InitialiseUser(): System.TypeInitializationException: An exception was thrown by the type initializer for ServiceStack.Text.Json.JsonReader`1 ---> System.ArgumentNullException: Argument cannot be null.
E/MyApp(14494): Parameter name: method
E/MyApp(14494):   at System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, Boolean throwOnBindFailure, Boolean allowClosed) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at ServiceStack.Text.PlatformExtensions.MakeDelegate (System.Reflection.MethodInfo mi, System.Type delegateType, Boolean throwOnBindFailure) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at ServiceStack.Text.Json.JsonReader.GetParseFn (System.Type type) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at ServiceStack.Text.Json.JsonTypeSerializer.GetParseFn (System.Type type) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at ServiceStack.Text.Common.TypeAccessor.Create (ITypeSerializer serializer, ServiceStack.Text.TypeConfig typeConfig, System.Reflection.PropertyInfo propertyInfo) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at ServiceStack.Text.Common.DeserializeTypeRef.GetTypeAccessorMap (ServiceStack.Text.TypeConfig typeConfig, ITypeSerializer serializer) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at ServiceStack.Text.Common.DeserializeType`1[ServiceStack.Text.Json.JsonTypeSerializer].GetParseMethod (ServiceStack.Text.TypeConfig typeConfig) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at ServiceStack.Text.Common.JsReader`1[ServiceStack.Text.Json.JsonTypeSerializer].GetCoreParseFn[Person] () [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at ServiceStack.Text.Common.JsReader`1[ServiceStack.Text.Json.JsonTypeSerializer].GetParseFn[Person] () [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at ServiceStack.Text.Json.JsonReader`1[MyLib.Person]..cctor () [0x00000] in <filename unknown>:0 
E/MyApp(14494):   --- End of inner exception stack trace ---
E/MyApp(14494):   at ServiceStack.Text.JsonSerializer.DeserializeFromString[Person] (System.String value) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at MyLib.Person.FromJson (System.String json, Boolean throwOnNullOrEmpty) [0x00000] in <filename unknown>:0 
E/MyApp(14494):   at MyApp.MainActivity.InitialiseUser () [0x00000] in <filename unknown>:0 

この後、Person のインスタンスは null です。

出力から、 Person のデフォルトのコンストラクターが見つからないようです (明示的に定義されたコンストラクターがありません)。

どんな助けでも大歓迎です。

4

2 に答える 2

1

最後に、以前の回答のコード メソッドでは解決できなかった問題を実際に見つけました。これは、リンカーが省略したクラスの一部が ServiceStack.Text アセンブリの内部にあったためです。

最終的に、リンク記述 XML の使用に戻りました。次のように見えました。

<?xml version="1.0" encoding="utf-8" ?>
<linker>
  <assembly fullname="ServiceStack.Text">
    <type fullname="ServiceStack.Text.Json.JsonReader`1" >
      <method name="GetParseFn" />
    </type>
    <type fullname="ServiceStack.Text.Common.DeserializeListWithElements`2" >
      <method name="ParseGenericList" />
    </type>
    <type fullname="ServiceStack.Text.Common.WriteListsOfElements`2" >
      <method name="WriteList" />
      <method name="WriteArray" />
    </type>
  </assembly>
</linker>

ここでこれを達成する方法についてブログを書きました。

于 2013-06-14T13:06:31.870 に答える