You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:48:22