【发布时间】:2013-08-12 22:35:30
【问题描述】:
我们向第三方开发者公开 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;
}
如果将第二个字段添加到类D,
class D implements Parcelable {
int field1;
int field2; // new field
}
类Cs 的解组失败(我尝试使用Parcel.writeList() 和Parcel.writeParcelableArray())。
这个案子无法处理,这似乎几乎是不可思议的。当然,我们可以保留旧的 binder 接口,并创建一个新的 binder 接口,返回带有附加字段的新类的对象,但是对于返回经常变化的类的服务,这将导致混乱的混乱。例如,接口 1.0 返回一个Person。现在我们添加一个字段,并且我们有一个新的 binder 接口 2.0,它返回 Person2 对象,等等。
这让我们可以使用一些更宽容的格式,例如 JSON,来传递 IPC 数据。
有什么建议吗?
【问题讨论】:
标签: android ipc parcelable aidl