我们向第三方开发者公开 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;
}
如果将第二个字段添加到 class D
,
class D implements Parcelable {
int field1;
int field2; // new field
}
类的解组C
失败(我尝试使用Parcel.writeList()
and Parcel.writeParcelableArray()
)。
这似乎几乎不可思议,这起案件无法处理。当然,我们可以保留旧的 binder 接口,并创建一个新的 binder 接口,该接口返回带有附加字段的新类的对象,但是对于返回经常更改的类的服务,这将导致混乱的混乱。例如,接口 1.0 返回一个Person
. 现在我们添加一个字段,我们有一个新的 binder 接口 2.0,它返回Person2
对象,等等。
这让我们可以使用一些更宽容的格式,比如 JSON,来传递 IPC 数据。
有什么建议么?