teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

バインディングを使用するしかなさそうなことを追記

2017/02/22 15:21

投稿

amay077
amay077

スコア1075

answer CHANGED
@@ -21,4 +21,23 @@
21
21
 
22
22
  * [Xamarin.Android で画面遷移時にデータを渡す - Qiita](http://qiita.com/amay077/items/8752e7e5db233f5cc73f)
23
23
 
24
- サービス周りは複雑なので、まずは ``.aidl`` を使わない Android-Java 製の Service に、Xamarin.Android から接続できるかなど、簡単そうなところから試された方が良いと思います。
24
+ サービス周りは複雑なので、まずは ``.aidl`` を使わない Android-Java 製の Service に、Xamarin.Android から接続できるかなど、簡単そうなところから試された方が良いと思います。
25
+
26
+
27
+ ## 2017.2.22 追記
28
+
29
+ > これは、そもそも「デシリアライズ」の仕方がわかってないだけのような気もしますが。
30
+ > Exceptionは戻そうとしても送信側で詰め込んだ型が見つからないよ。という事だとは思うのですが。。。
31
+
32
+ その通りでした。一部私も気づかなかったところがあったので追記します。
33
+
34
+ Javaで``Parcelable``を実装したクラス(``Card.java``とします)をシリアライズし、Xamarin.Androidで、``IParcelable``を実装したクラス(``Card.cs``)でデシリアライズはできません。Xamarin.Androidはビルド時に``mdXXXXXXXX.Card``というJavaのクラスを生成しますが、名前空間などが元々の``Card.java``と一致しないなど、両者に互換性がありません。
35
+ つまりXamarin.Androidで``IPercelable``や``ISerializable``を実装したクラスは、Javaと相互運用性がありません。
36
+
37
+ ではどうするかというと、Javaのバインディングライブラリを作成するしかなさそうです。
38
+
39
+ 具体的には、``Card.java``をJava側でアプリとは別のJARライブラリとして切り出し(``Card.jar``とします)、Xamarin.Android側でJavaバインディングプロジェクトを作成して、``Card.jar``を取り込みます。
40
+
41
+ このJavaバインディングプロジェクトを参照したアプリプロジェクトであれば、``Card.java``をシリアライズしたデータをデシリアライズ可能と思います。
42
+
43
+ 本来なら試してから回答すべきですが、取り急ぎ情報共有のため追記しました。