关于我的代码示例,如果一个 Locable 的变量为空,我该怎么办?例如,现在如果 l.getZoom() 返回 null,我得到了 NullPointerException。
@Override
public void writeToParcel(Parcel parcel, int arg1) {
parcel.writeInt(count);
for(Locable l:locableArr){
parcel.writeInt(l.getOriginId());
parcel.writeInt(l.getLocableType());
parcel.writeInt(l.getZoom());
parcel.writeDouble(l.getLatituda());
parcel.writeDouble(l.getLongituda());
parcel.writeString(l.getTitle());
parcel.writeString(l.getSnipet());
}
}
谢谢!
Parcel.writeValue
封送具有空值的通用对象。
我正在使用一个Parcelable
类,该类也具有Integer
和Boolean
字段,这些字段可以为空。
我在使用通用Parcel.writeValue
方法时遇到问题,尤其是当我尝试通过 Parcel.readValue
读回它时。 我一直收到运行时异常,说它无法确定包裹对象的类型。
最终,我能够通过将Parcel.writeSerializable
和Parcel.readSerializable
与类型转换一起使用来解决问题,因为Integer
和Boolean
都实现了可序列化接口。 读取和写入方法为您处理null
值。
这是我想出的安全写入字符串的解决方案:
private void writeStringToParcel(Parcel p, String s) {
p.writeByte((byte)(s != null ? 1 : 0));
p.writeString(s);
}
private String readStringFromParcel(Parcel p) {
boolean isPresent = p.readByte() == 1;
return isPresent ? p.readString() : null;
}
我见过的大多数序列化代码都使用标志来指示值的存在/不存在,或者在值前面加上一个计数字段(例如,在编写数组时),如果值根本不存在,则计数字段仅设置为零。
检查 Android 核心类的源代码会发现这样的代码(来自 Message 类):
if (obj != null) {
try {
Parcelable p = (Parcelable)obj;
dest.writeInt(1);
dest.writeParcelable(p, flags);
} catch (ClassCastException e) {
throw new RuntimeException(
"Can't marshal non-Parcelable objects across processes.");
}
} else {
dest.writeInt(0);
}
或者这个(来自意图类):
if (mCategories != null) {
out.writeInt(mCategories.size());
for (String category : mCategories) {
out.writeString(category);
}
} else {
out.writeInt(0);
}
我的建议:在您的代码中,如果"zoom == null"和"zoom == 0"之间没有功能差异,那么我只会将 zoom 声明为原语(int
而不是 Integer
)或在构造函数中将其初始化为零并确保永远不会将其设置为 null(然后您可以保证它永远不会为 null,并且您不必在序列化中添加特殊代码来处理它/反序列化方法)。