在 Android 中实现对象的深拷贝可以使用以下方法:

方法一:使用 'Serializable' 接口

  1. 首先,确保你的类实现了 'Serializable' 接口。例如,我们有一个叫做 'MyClass' 的类,可以这样定义:
public class MyClass implements Serializable {
    // 类的成员变量和方法...
}
  1. 创建一个辅助方法,用于执行深拷贝。例如:
public MyClass deepClone(MyClass original) {
    try {
        // 创建一个字节流输出流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        
        // 创建一个对象输出流,并将其绑定到字节流输出流上
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        
        // 将原始对象写入到对象输出流中
        objectOutputStream.writeObject(original);
        
        // 关闭输出流
        objectOutputStream.close();
        
        // 创建一个字节流输入流,使用之前的字节流输出流的字节数组作为输入
        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        
        // 创建一个对象输入流,并将其绑定到字节流输入流上
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        
        // 从对象输入流中读取对象,这将是一个深拷贝的副本
        MyClass clone = (MyClass) objectInputStream.readObject();
        
        // 关闭输入流
        objectInputStream.close();
        
        // 返回深拷贝的副本
        return clone;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
  1. 若要执行深拷贝操作,只需调用上述辅助方法即可:
MyClass original = new MyClass();
MyClass clone = deepClone(original);

方法二:使用 'Parcelable' 接口

  1. 确保你的类实现了 'Parcelable' 接口。例如:
public class MyClass implements Parcelable {
    // 类的成员变量和方法...
}
  1. 添加 'Parcelable' 接口所需的方法和构造函数。可以通过 Android Studio 自动生成这些方法,点击类名 -> 右键 -> Generate -> Parcelable。

  2. 创建一个辅助方法,用于执行深拷贝。例如:

public MyClass deepClone(MyClass original) {
    Parcel parcel = Parcel.obtain();
    original.writeToParcel(parcel, 0);
    parcel.setDataPosition(0);
    MyClass clone = MyClass.CREATOR.createFromParcel(parcel);
    parcel.recycle();
    return clone;
}
  1. 若要执行深拷贝操作,只需调用上述辅助方法即可:
MyClass original = new MyClass();
MyClass clone = deepClone(original);

这些是在 Android 中实现对象深拷贝的两种常见方法。你可以根据具体情况选择其中一种方法实现深拷贝。

Android 对象深拷贝:使用 Serializable 和 Parcelable 接口

原文地址: https://www.cveoy.top/t/topic/cK03 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录