文章目录
所有的项目开发一定都有序列化的概念存在.
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化的基本实现
所谓的对象序列化指的是在我们内存中保存的对象变为二进制流的形式进行传输, 或者是将其保存在文本中.
但是并不意味着所有类的对象都可以被序列化, 严格来讲, 需要被序列化的类往往需要传输使用, 同时这个类**必须实现 java.io.Serializable接口, 但是这个接口并没有任何的方法定义, 只是一个标识接口
**
实际上序列化类保存的就是二进制流的属性
案例: 使用序列化对接口实现
@SuppressWarnings("serial")
class PersonTWO implements java.io.Serializable{
private String name;
private int age;
@Override
public String toString() {
return "PersonTWO [name=" + name + ", age=" + age + "]";
}
}
序列化对象时所需要保存的就是类中对象的属性, 所以默认情况下对象中的属性会被转成二进制数据流存在.
序列化与反序列化操作
如果要实现序列化与反序列化的对象操作, 在java.io 提供有两个处理类:
ObjectOutputStream, ObjectInputStream
ObjectOutputStream 序列化类的定义结构和构造方法
public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants
public ObjectOutputStream(OutputStream out)
throws IOException
序列化操作
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
ObjectInputStream 反序列化类的定义结构和构造方法
public class ObjectInputStream
extends InputStream
implements ObjectInput, ObjectStreamConstants
public ObjectInputStream(InputStream in)
throws IOException
反序列化操作
package com.cwq.beyond;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.sun.org.apache.bcel.internal.generic.NEW;
@SuppressWarnings("serial")
class PersonTWO implements java.io.Serializable{
private String name;
private int age;
public PersonTWO(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "PersonTWO [name=" + name + ", age=" + age + "]";
}
}
public class Serializable {
public static final File FILE = new File("D:"+File.separator+"person.ser");
// 序列化操作
public static void ser(Object obj) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE));
oos.writeObject(obj);
oos.close();
}
// 反序列化操作
public static void dser() throws Exception{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE));
System.out.println(ois.readObject());
}
public static void main(String[] args) throws Exception {
ser(new PersonTWO("张三", 20));
dser();
}
}
结果:
总结:
在以后实际的项目开发之中, 总会有自动的容器帮助你做序列化与反序列化,
序列化就是将对象变成 二进制数据流
transient 关键字
实际上序列化的处理在 java.io 包里面有两类 , Serializable 是采用最多的序列化接口, 这种操作采用自动化的模式完成, 也就是说默认的情况下所有的属性都会被序列化下来, 还有一个 Externalizable
接口是需要用户自己来动手处理序列化操作, 一般很少使用
但是由于默认情况 Serializable 会将对象中所有的属性进行保存, 如果现在某些属性不希望被保存了, 那么可以使用 transient 关键字
进行不序列化操作
案例: 使用 transient
不过大部分情况下使用序列化往往是在简答JAVA类上, 其他类上使用序列化操作模式相对较少, 而如果是简答java类就很少去使用 transient 了