AIDL サービスをサードパーティの開発者に公開します。このサービスからパーセル可能なオブジェクトを返したいのですが、下位互換性について懸念があります。これは、Parcelable のバージョン N に対してコンパイルされたクライアントと、バージョン N+1 に対してコンパイルされたサービスが連携する必要があることを意味します。
私のテストによると、単純なフラット オブジェクト (単純型フィールドのみ) の場合、新しいフィールドがストリームの最後に分割されている限り、後方互換性は可能です。たとえば、
in.writeInt(field1);
in.writeInt(field2); // new field
ただし、複雑なオブジェクトになると、事態は一変します。例えば、
class D implements Parcelable {
int field1;
}
class C implements Parcelable {
List<D> ds;
}
2 番目のフィールドが class に追加された場合D
、
class D implements Parcelable {
int field1;
int field2; // new field
}
クラス s のアンマーシャリングがC
失敗します ( and を使用しParcel.writeList()
てみParcel.writeParcelableArray()
ました)。
これは、このケースを処理できないことはほとんど考えられないようです。確かに、古いバインダー インターフェースをそのまま残して、新しいクラスのオブジェクトを追加のフィールドと共に返す新しいバインダー インターフェースを作成することはできますが、頻繁に変化するクラスを返すサービスの場合、これは複雑な混乱を招きます。たとえば、インターフェイス 1.0 は を返しますPerson
。Person2
ここでフィールドを追加し、オブジェクトを返す新しいバインダー インターフェイス 2.0 を用意しました。
これにより、JSON などのより寛容な形式を使用して IPC データを渡すことができます。
助言がありますか?