Dotcpp  >  编程教程  >  Java输入输出流  >  Java序列化与对象克隆

Java序列化与对象克隆

点击打开在线编译器,边学边练

我们已经知道,一个类的两个对象如果具有相同的引用,那么它们就具有相同的实体和功能,比如:

A one = new A();
A two = one;


假设A类有名字为x的int型成员变量,那么,如果进行如下操作:

two.x = 100;

那么one.x的值也会是100。


再比如,某个方法的参数是People类型:

public void f(People p) {
    p.x = 200;
}

如果调用该方法时,将People的某个对象的引用,比如zhang,传递给参数P,那么该方法执行后,zhang.x的值也将是200。


有时想得到对象的一个“复制品”,复制品实体的变化不会引起原对象实体发生变化,反之亦然。这样的复制品称为原对象的一个克隆对象或简称克隆


使用对象流很容易获取一个序列化对象的克隆,只需将该对象写入对象输出流指向的目的地,然后将该目的地作为一个对象输入流的源,那么该对象输入流从源中读回的对象一定是原对象的一个克隆,即对象输入流通过对象的序列化信息来得到当前对象的一个克隆。例如,上节例子中的对象xinfei就是对象changhong的一个克隆。


当程序想以较快的速度得到一个对象的克隆时,可以用对象流将对象的序列化信息写入内存,而不是写入到磁盘的文件中。对象流将数组流作为底层流就可以将对象的序列化信息写入内存。例如,我们可以将上节例子中的

FileOutputStream fileOut = new FileOutputStream(file);
ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);

FileInputStream fileIn = new FileInputStream(file);
ObjectInputStream objectIn = new ObjectInputStream(fileIn);

分别更改为:

ByteArrayOutputStream outByte = new ByteArrayOutputStream();
ObjectOutputStream objectOut = new ObjectOutputStream(outByte);

ByteArrayInputStream inByte = new ByteArrayInputStream(outByte.toByteArray());
ObjectInputStream objectIn = new ObjectInputStream(inByte);


java.awt包中的Component类是实现Serializable接口的类,组件是序列化对象,因此,程序可以把组件写入输出流,然后再用输入流读入该组件的克隆



本文固定URL:https://www.dotcpp.com/course/877

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Java教程
第一章 Java入门
第二章 Java运算符和表达式
第三章 Java流程控制
第四章 Java类和对象
第五章 Java子类与继承
第六章 Java接口与实现
第七章 Java内部类与异常类
第八章 Java常用实用类
第九章 Java输入输出流
第十章 Java数组
Dotcpp在线编译      (登录可减少运行等待时间)