Android Studio跨应用传递自定义Serializable对象报错求助
跨Android应用传递Serializable对象出现ClassNotFoundException的解决方法
核心原因
跨应用传递Serializable对象时,接收端APK必须包含完全一致的目标类定义(包名、类名、字段、访问权限、serialVersionUID都要匹配),否则系统无法找到并加载该类,抛出ClassNotFoundException。
具体解决方案
1. 保证两个应用的PatientObj类完全一致
- 包名与类名严格匹配:发送端的类是
com.global.data.PatientObj,接收端必须在同一个包路径下创建完全同名的类,不能修改包名或类名。 - 显式声明serialVersionUID:Serializable类必须显式定义这个常量,避免因类结构细微变化导致序列化不兼容。示例:
private static final long serialVersionUID = 1L; - 补全类的完整结构:你的代码中缺少字段定义和部分setter方法,这会导致序列化失败。修正后的完整类:
public class PatientObj implements Serializable { private static final long serialVersionUID = 1L; private String UserId; private String PatientId; private String PatientName; public String getUserId() { return UserId; } public void setUserId(String userId) { UserId = userId; } public String getPatientId() { return PatientId; } public void setPatientId(String patientId) { PatientId = patientId; } public String getPatientName() { return PatientName; } public void setPatientName(String patientName) { PatientName = patientName; } } - 修正语法错误:原代码中
Public是大写,违反Java语法规范,必须改为小写public。
2. 确保类的访问权限
PatientObj类必须用public修饰,默认包访问权限的类无法被其他应用的进程加载。
3. 推荐使用Parcelable替代Serializable
Android官方更推荐用Parcelable实现跨进程/应用对象传递,它比Serializable效率更高,适配性更好。实现Parcelable的PatientObj示例:
public class PatientObj implements Parcelable { private String userId; private String patientId; private String patientName; public PatientObj() {} protected PatientObj(Parcel in) { userId = in.readString(); patientId = in.readString(); patientName = in.readString(); } public static final Creator<PatientObj> CREATOR = new Creator<PatientObj>() { @Override public PatientObj createFromParcel(Parcel in) { return new PatientObj(in); } @Override public PatientObj[] newArray(int size) { return new PatientObj[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(userId); dest.writeString(patientId); dest.writeString(patientName); } // getter和setter方法 public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPatientId() { return patientId; } public void setPatientId(String patientId) { this.patientId = patientId; } public String getPatientName() { return patientName; } public void setPatientName(String patientName) { this.patientName = patientName; } }
传递和接收方式:
- 发送端:
intent.putExtra("data", new PatientObj()); - 接收端(Android 13及以上):
PatientObj data = intent.getParcelableExtra("data", PatientObj.class); - 接收端(Android 12及以下):
PatientObj data = (PatientObj) intent.getParcelableExtra("data");
内容的提问来源于stack exchange,提问作者Farzan Siddiqui
相关产品推荐
相关产品推荐

