Serializable Clonable
序列化机制有一种很有趣的用法:
可以方便的克隆对象,只要对应的类是可序列化的即可。
操作流程:
直接将对象序列化到输出流中,然后将其读回。这样产生的新对象是对现有对象的一个深拷贝(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;@Overrideprotected 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;}@Overridepublic String toString() {return getClass().getName() + " [name=" + name + ", salary=" + salary + ", hireDay=" + hireDay + "]";}}
Output:
false io.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]
Serializable Clonable相关推荐
- java question_Core Java Question List No3
Can an abstract class be defined without any abstract methods? Yes, it's possible. This is basically ...
- Serializable 都这么牛逼了,Parcelable 还要你何用?
一些闲聊 距离上一篇文章似乎又是很久了,看起来也没有很多反馈,催更就更不用说了.哈哈,放弃了. 话说最近公司在招聘一批至少 5 年开发经验的 Android 开发工程师,我也是忙开了花,激动得不行呀. ...
- Parcelable与Serializable的比较
Parcel: Android中的序列化方式,可用于跨进程传输 Parcelable 进程间 如:想从一个第三方app拿进程回来 Serializable 进程内
- Java开发规范,不要新建一个类就实现Serializable接口
个人网站:http://xiaocaoshare.com/ 作为一名java开发者,细节决定技术的高度和深度 一个java类什么时候需要实现Serializable接口 1.什么是Serializab ...
- Spark Troubleshooting - Task not serializable问题分析
本文首发于 www.yidooo.net/2018/08/19/- 转载请注明出处 问题描述 出现"org.apache.spark.SparkException: Task not ser ...
- Parcelab 和 Serializable
2019独角兽企业重金招聘Python工程师标准>>> Parcelable 效率高,但不能用于在磁盘存储的情况,因为 Parcelable 不能很好的保证数据的持续性在外界有变化的 ...
- 为什么要继承Serializable类?
为什么要实现Serializable? 最重要的两个原因是: 1.将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本: 2.按值将对象从一个应用程序域发送至另一个应用程序域. 通俗的说 ...
- 我对序列化(Serializable)的理解
转自:http://blog.tianya.cn/blogger/post_show.asp?BlogID=764&PostID=3231409 序列化是把一个对象的状态写入一个字节流的过程. ...
- Serializable接口
什么是java序列化,如何实现? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间. 序列化是为了解决在对 对 ...
最新文章
- 考PMP证书一定要参加PMP培训吗?
- Swift Tips - 在 Swift 中自定义下标访问
- exit函数的头文件问题
- 金融业(互联网金融)创新---我的实地考察和见解
- jdk1.8_googleV3免费下载(API中文文档)
- python判断字符大小写转换_Python 字符串大小写转换的简单实例
- java中week of year_Java WeekFields weekOfYear()用法及代码示例
- Django REST framework 源码解析
- Informix IDS 11系统料理(918查验)认证指南,第 4 部分: 功能调优(5)
- python自学行吗-大家觉得自学python多久能学会?
- freemarker 解析对象的某元素_Freemarker常用技巧(三)
- PostgreSQL和MySQL
- c语言设计通讯录设计报告,C语言通讯录课程设计报告--设计一个通讯录管理系统...
- 从 iTunes 和 Finder 断开 iPhone 连接的三种方法
- Android apps 拍立知-功能实现(百度tts语音合成使用)
- 301work 不积跬步无以至千里Asp.net程序
- Redis从精通到入门——数据类型Zset实现源码详解
- 成为认知高手,要避免这9个认知思维陷阱!
- Shell 小脚本集合
- 零基础想要快速的学好3D游戏建模,兼职接单私活,来看业内人士的分析
热门文章
- hadoop实战二 单机部署2
- pku1985 Cow Marathon
- 管理SharePoint中的账号的密码
- 配置Cisco ASA and Cisco *** Client 4.x with Windows 2003 IAS RADIUS Authentication
- JS验证框架的使用方法
- java的数值类型举例_Java基本类型(示例代码)
- 解决fitz模块报错
- ArduinoYun的电源插座
- python类实例化 输入参数名字 下划线_Python 的类的下划线命名有什么不同?
- qchart画完以后删除_画错了,重新画一幅吧!”这句话对学画画的孩子来说,伤害有多大?...