博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Serializable Clonable
阅读量:5914 次
发布时间:2019-06-19

本文共 2891 字,大约阅读时间需要 9 分钟。

序列化机制有一种很有趣的用法:

可以方便的克隆对象,只要对应的类是可序列化的即可。
操作流程:
直接将对象序列化到输出流中,然后将其读回。这样产生的新对象是对现有对象的一个深拷贝(deep copy)。在此过程中,不需要将对象写出到文件中,因为可以用ByteArrayOutputStream将数据保存到字节数组中;
tips:
方法的确很灵巧,但通常会比显式地构建新对象并复制或克隆数据域的克隆方法慢得多。

package io.clone;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.Date;import java.util.GregorianCalendar;/*2015-7-10*/public class SerialCloneTest {    public static void main(String[] args) throws CloneNotSupportedException {        Employee harry = new Employee("Harry Hacker", 60000, 1987, 1, 20);        Employee harryClone = (Employee) harry.clone();        System.out.println(harry.equals(harryClone));        harry.raiseSalary(20);        System.out.println(harry);        System.out.println(harryClone);    }}class SerialCloneable implements Cloneable, Serializable {    private static final long serialVersionUID = 2439604536150013106L;    @Override    protected Object clone() throws CloneNotSupportedException {        try {            ByteArrayOutputStream bout = new ByteArrayOutputStream();            ObjectOutputStream out = new ObjectOutputStream(bout);            out.writeObject(this);            out.close();            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());            ObjectInputStream in = new ObjectInputStream(bin);            Object ret = in.readObject();            in.close();            return ret;        } catch (IOException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        return super.clone();    }}class Employee extends SerialCloneable {    private static final long serialVersionUID = -167978670073609475L;    private String name;    private double salary;    private Date hireDay;    public Employee(String name, double salary, int year, int month, int dayOfMonth) {        super();        this.name = name;        this.salary = salary;        GregorianCalendar calendar = new GregorianCalendar(year, month - 1, dayOfMonth);        this.hireDay = calendar.getTime();    }    public String getName() {        return name;    }    public double getSalary() {        return salary;    }    public Date getHireDay() {        return hireDay;    }    public void raiseSalary(double byPercent) {        double raise = salary * byPercent / 100;        salary += raise;    }    @Override    public String toString() {        return getClass().getName() + " [name=" + name + ", salary=" + salary + ", hireDay=" + hireDay + "]";    }}

Output:

falseio.clone.Employee [name=Harry Hacker, salary=72000.0, hireDay=Tue Jan 20 00:00:00 CST 1987]io.clone.Employee [name=Harry Hacker, salary=60000.0, hireDay=Tue Jan 20 00:00:00 CST 1987]

 

转载于:https://www.cnblogs.com/softidea/p/4634658.html

你可能感兴趣的文章
ps基本操作
查看>>
JS-OO-数据属性,访问器属性
查看>>
unity3d 各键值对应代码
查看>>
php strpos() 函数介绍与使用方法详解
查看>>
10年程序员的一些人生感悟
查看>>
矩阵运算
查看>>
iOS_仿QQ表情键盘
查看>>
Struts2环境搭建与测试
查看>>
CGridCtrl显示子控件 及事件
查看>>
【BZOJ】4756: [Usaco2017 Jan]Promotion Counting
查看>>
maven构建SSM项目
查看>>
Page.FindControl(string id) 与母版页结合后发现的一个问题
查看>>
D - 二叉树遍历(推荐)
查看>>
C#匿名函数内存泄漏
查看>>
自定义注解实现aop
查看>>
20160411001 杀掉所有的事件探察器进程
查看>>
eclipse引入tomcat
查看>>
linux下crontab实现定时服务详解
查看>>
css选择器
查看>>
合并k个有序链表
查看>>