2015-01-14 13 views
5

の「コンストラクタを見つけることができません」、そしてそれは私が半年前にそれを持っていなかっ考えると、かなり新しい問題です。私はXamarinでアプリを作って半年前、3店舗(App Store、Google Play、Microsoft Store)でリリースしました。JsonSerializationException私は私のコードで、この非常に奇妙な問題を抱えているXamarin.Android

昨日ユーザーがAndroidアプリに問題があることを報告し、私が固定され、再コンパイルすることを、私は今Json.NET

で新しいエラーが発生していました後に例外が

Newtonsoft.Json.JsonSerializationException: Unable to find a constructor to use for type Rowlog.Common.Dtos.CompressedTripData. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'tripCoordinates', line 1, position 19. 

ですそして、あなたが尋ねる前に、はいRowlog.Common.Dtos.CompressedTripDataは、実際にはパラメータのないコンストラクタを持っています(まったく同じものはありません)。

私が言ったように、これは、Androidデバイス上のサーバーからCompressedTripDataオブジェクトをロードするときです。 iOSとWindows Phoneでまったく同じオブジェクトを読み込んでも問題はありません。 私は、Json.NETやXamarin.Androidの最近の変更がこれを引き起こしていると推測しています(他のアプリはまだ約半年前からJson.NETライブラリを使用しています。以来、それへの更新)

は誰にも同様の問題が発生し、そうであれば、どのようにあなたがそれを固定していたのされていますか?

答えて

13

プロジェクトプロパティの[Android options]タブには、[linker]タブがあります。 'リンクする'ドロップダウンで選択したオプションは「Sdkアセンブリのみ」ですか、または「Sdkアセンブリとユーザーアセンブリ」ですか?

後者の場合、リンクが使用されないため、パラメータレスコンストラクタはスキップされます。 「Sdkアセンブリのみ」に変更してください。

+0

うん、それが問題でした。ありがとう、偉大な先生、あなたは本当に命の恩人です! – Falgantil

+0

ありがとうございます - リリースビルドでこのエラーが発生しましたが、デバッグビルドではありませんでした。これらのリンカオプションの効果は明ら​​かではないので、私は時間を大幅に節約できました(そして、私はJSON.NETにデシリアライゼーションをもっと手伝っていました)。私はこの設定が、AndroidアプリパッケージにリンクされたDLLを別のライブラリパッケージと比較して判断することだったという印象を受けていました... –

1

保存属性を使用すると、まだそれは一般的に、それはあなたのコードを持つことだ行うことを好む場合メンバーは、リンカによって除去されていないことを確認するために、より集中的な方法です。

例:

[Preserve] 
[JsonConstructor] 
private AlertRequest(bool fake_arg) 
{ 
    // fake_arg is to have a unique ctor that we exclusively 
    // use in JSON de-serialization via JsonConstructor attribute. 
    // Preserve attribute ensures Xamarin linker does not remove, 
    // as there are no direct uses of this ctor in the code base 
} 
+0

これを試してみると例外が発生します: '「LinkAssemblies」タスクが失敗しました。 ..失敗した解決策Mono.Security.MonoTlsProviderFActoryDe​​legate' – Akbari

+0

SO @Akbariに関する新しい質問をすることをお勧めします。私は最近、Androidをあまり使っていません。 – t9mike

関連する問題