相信很多同学都使用过serializable,相信在项目中一般你的项目经理肯定和你说过记得在你的domain的类中实现serializable,不然有时会出现一些错误。但是serializable具体是做什么的呢?为什么我们要实现他?他又有什么作用呢?
serializable
人称序列化,所谓序列化即是将对象以二进制的形式保存在你所需要的介质中,让其达到永久保存的目的。 有序列化那么一定就有反序列化,不然光存不能取又有什么意义呢? 所谓反序列化即是将序列化好的二进制内容获取并转换回对象的一个过程。 光说概念同学们也许会很蒙逼,我们直接上Demo。
Demo1(永久保存对象)
需求:将User对象内容永久保存到硬盘中,随时可以取出。 实现:
1.创建User类(一定要实现Serializable,否则会报错)
import java.io.Serializable;
/**
* Created by beyondLi on 2017/6/7.
*/
public class User implements Serializable{
private String name;
private Integer age;
public String
getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer
getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String
toString() {
return "User{" +
"name='" + name +
'\'' +
", age=" + age +
'}';
}
}
2.进行序列化
@Test
public void serializableTest()
throws Exception {
User user =
new User();
user.setName(
"beyondLi");
user.setAge(
23);
File file =
new File(
"H:\\test.txt");
FileOutputStream fos =
new FileOutputStream(file);
ObjectOutputStream oos =
new ObjectOutputStream(fos);
oos.writeObject(user);
oos.flush();
oos.close();
fos.close();
}
执行后会生成文件,内容如下 MMP这是什么鬼?看不懂啊。 这就是序列化后的内容,我也看不懂。但是人家计算机能读懂。
3.反序列化取值
@Test
public void serializableTest2()
throws Exception {
File file =
new File(
"H:\\test.txt");
FileInputStream fis =
new FileInputStream(file);
ObjectInputStream ois =
new ObjectInputStream(fis);
User user = (User) ois.readObject();
System.out.println(user);
ois.close();
fis.close();
}
4.运行结果
我们会发现 我们之前序列化的对象已经被我们直接取出了。这样我们就能通过序列化对对象内容进行永久的保存了。
5.如果User对象没有实现序列化接口则会在运行时报错
很明显告诉你serializable异常
Demo2(对象克隆)
需求:使用序列化与反序列化将user对象进行克隆,并对克隆后的数据进行修改。
1.创建User
import java.io.Serializable;
/**
* Created by beyondLi on 2017/6/7.
*/
public class User implements Serializable{
private String name;
private Integer age;
public String
getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer
getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String
toString() {
return "User{" +
"name='" + name +
'\'' +
", age=" + age +
'}';
}
}
2.编写克隆工具类
package com.beyondli.base.utils;
import java.io.*;
/**
* Created by beyondLi on 2017/6/8.
* 对象clone工具类
*/
public class CloneUtils {
private CloneUtils() {
throw new AssertionError();
}
public static <T extends Serializable> T
clone(T obj)
throws Exception {
ByteArrayOutputStream bout =
new ByteArrayOutputStream();
ObjectOutputStream oos =
new ObjectOutputStream(bout);
oos.writeObject(obj);
ByteArrayInputStream bin =
new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois =
new ObjectInputStream(bin);
return (T) ois.readObject();
}
}
3.测试类
@Test
public void cloneTest()
throws Exception {
User user =
new User();
user.setName(
"beyondLi");
user.setAge(
23);
User clone = CloneUtils.clone(user);
clone.setName(
"zyt");
System.out.println(user);
System.out.println(clone);
}
4.运行结果
以上是对serializable一些基本概念的理解以及实际的一些应用。内容为本人自己理解,如有不足或错误,望指出。共同成长。