Android_Serializable_Parcelable_多进程

本文对比了Java中的Serializable与Android特有的Parcelable接口,介绍了它们在序列化过程中的使用方法及各自的优缺点,并探讨了多进程环境下可能遇到的问题。

1. Serializable

Serializable:序列化 接口,是Java提供的,谁想序列化就实现这个接口。序列化的是对象,不是类,静态成员变量是属于类的不属于对象的,不参加序列化。
 serialVersionUID:是在反序列化的时候用的,序列化的时候把系统当前类的serialVersionUID写入到文件中,在反序列化的时候,系统去检测文件中的serialVersionUID 是否和当前类的 serialVersionUID 一样,一样的话就反序列化成功,不一样就抛出 java.io.InvalidClassException异常
 //序列化过程  写数据的过程
        User user = new User("zhangqi", 14);
        File file = new File(Environment.getExternalStorageDirectory(), "cache.txt");
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
            objectOutputStream.writeObject(user);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (objectOutputStream != null) {
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        //反序列化过程  读数据的过程
        try {
            objectInputStream = new ObjectInputStream(new FileInputStream(file));
            User mUser = (User) objectInputStream.readObject();
            if (mUser != null) {
                Log.d("name = ", mUser.getName());
                Log.d("age = ", String.valueOf(mUser.getAge()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (objectInputStream != null) {
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

2. Parcelable

public class ParcelUser implements Parcelable {

    private String name;
    private int age;
    private String address;

    public ParcelUser(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    /**
     * 从序列化后的对象中,转化成原对象
     * @param in
     */
    protected ParcelUser(Parcel in) {
       name = in.readString();
       age = in.readInt();
       address = in.readString();

    }

    public static final Creator<ParcelUser> CREATOR = new Creator<ParcelUser>() {
        /**
         * 从序列化后的对象中,创建原始对象
         * @param in
         * @return
         */
        @Override
        public ParcelUser createFromParcel(Parcel in) {
            return new ParcelUser(in);
        }

        @Override
        public ParcelUser[] newArray(int size) {
            return new ParcelUser[size];
        }
    };

    /**
     * 返回当前对象的描述性文件,一般都是返回0,如果当前对象有描述性文件,就返回当前的文件
     * @return
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 将现有的对象,写入到序列化机构中
     * @param dest
     * @param flags
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeString(address);
    }
}

3. Serializable 和 Parcelable 优缺点

Serializable:使用简便,但是效率低,有很多I/O 操作
Parcelable:使用复杂,但是效率高,是Android平台提供的,优先考虑使用这个。

4. 多进程的创建

1)在配置文件中,给活动设置属性 process="进程名"

 默认不设置的,进程名为当前应用的包名

进程名=“:test” 此种方式的表明 是 包名的基础上加上 .test,此种进程属于当前应用的私有进程,其他应用或者组件不能和这个进程跑到一起。

使用多进程出现的问题

* 多进程:
* 1)静态成员变量与单例模式都会失效
* 2)线程的同步机制失效
* 3)SharedPreferences的可靠性下降:底层是 读写xml文件的,
* 4)会多次启动Application
Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值