Android中使用Parcelable传递Match对象时数据损坏问题
Android Parcelable传递Match对象数据损坏排查方案
Parcelable读写字段顺序不匹配
检查Match类的writeToParcel()和CREATOR.createFromParcel()方法,两个方法里的字段读写顺序必须完全一致。比如writeToParcel里先写id、再写local、接着写score、opponentName,那createFromParcel里必须按同样的顺序读取这些字段。顺序错位会导致后续字段读取到错误位置的数据,出现只有前几个字段正常的情况。字段类型读写方法不对应
确保每个字段的写入和读取方法类型严格匹配:- 基本类型:
int用writeInt()/readInt(),long用writeLong()/readLong();布尔值注意低版本API用writeByte((byte)(flag ? 1 : 0))和readByte() != 0,不要误用readBoolean()(Android 10及以上才支持)。 - 自定义Parcelable类型:如果
Match里包含其他Parcelable对象(比如User),写入时要调用obj.writeToParcel(parcel, flags),读取时要通过User.CREATOR.createFromParcel(parcel)实例化,不能直接用基本类型读写方法。 - 字符串/集合:
String用writeString()/readString(),集合类要使用writeList()/readList()等对应方法。
- 基本类型:
CREATOR实现错误
检查CREATOR的createFromParcel()方法:- 实例化
Match对象时,传入的参数顺序要和读取字段的顺序一致,不能漏传或错传字段。 newArray()方法必须返回正确类型的数组,比如return new Match[size];,不能写成new Object[size];。
- 实例化
空值/默认值处理不当
对于可能为null的字段(比如String类型),写入时直接调用writeString(null)即可,读取时readString()会正确返回null;如果自行处理为空字符串再写入,可能导致接收端解析异常。另外,基本类型字段要确保写入时的默认值和读取时的处理逻辑一致,避免出现默认值覆盖有效数据的情况。
内容的提问来源于stack exchange,提问作者Jmx
相关产品推荐
相关产品推荐

