对象的寿命通常随着生成该对象的程序的终止而终止,有时候需要把在内存中的各种对象的状态(也就是实例变量,不是方法)保存下来, 并且可以在需要时再将对象恢复。
用途:1.想把内存中的对象状态保存到一个文件中或者数据库中时候
2.想把对象通过网络进行传播的时候
Java 序列化技术可以使你将一个对象的状态写入一个Byte 流里(序列化),并且可以从其它地方把该Byte 流里的数据读出来(反序列化)。
序列化的作用就是为了不同jvm之间共享实例对象的一种解决方案.由java提供此机制,效率之高,是其他解决方案无法比拟的.
Serializable主要用来支持两种主要的特性:
1、Java的RMI(remote method invocation),RMI允许像在本机上一样操作远程机器上的对象,当发送消息给远程对象时,
就需要用到序列化机制来发送参数和接受返回值
2、Java的JavaBean,Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被保存下来,以便当程序运行时能恢复这些状态信息,这也需要Serializable机制
调用OutputStream的 writeObject 方法实现, 如果要让 java 帮我们做, 要被传输的对象必须实现serializable 接口 , 这样, javac 编译时就会进行特殊处理, 编译的类才可以被writeObject 方法操作, 这就是序列化。
需要被序列化的类必须实现Serializable 接口, 该接口是一个 mini 接口, 其中没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的。
import java.io.Serializable;
public class Student implements Serializable {
//private static final long serialVersionUID = 1L;
public transient String name;
public static String address;
public transient int phone=123;
public static int age=12; // transient瞬态修饰成员,不会被序列化
public void addressCheck() {
System.out.println("Address check : " + name + " -- " + address+"--"+age+"---"+phone);
}
}
**序列化**
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class demo {
public static void main(String[] args) {
Student e = new Student();
e.name = "张三";
e.address = "深圳";
e.age = 20;
e.phone = 456;
try {
FileOutputStream fos = new FileOutputStream("a.txt");
// 创建序列化流对象
ObjectOutputStream out = new ObjectOutputStream(fos);
// 写出对象
out.writeObject(e);
// 释放资源
out.close();
fos.close();
System.out.println("序列化数据已保存");
} catch (Exception i) {
i.printStackTrace();
}
}
}
调用序列化类的参数时,若设置了变量的值,
1.如果序列化类没有设置变量的值,static和transient都返回各自类型的默认初始值,如int为0,string为null
2.如果序列化类有设置值,static返回这个设置的值,transient仍返回默认初始值
不想初始化的变量,用transient修饰. static是类的变量,保存的是初始值
反序列化
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class demo {
public static void main(String[] args) {
try {
Student student = null;
FileInputStream fis = new FileInputStream("a.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
// 读取一个对象
student = (Student) ois.readObject();
// 释放资源a
ois.close();
fis.close();
System.out.println("Name: " + student.name);
System.out.println("Age: " + student.age);
student.addressCheck();
} catch (Exception i) {
i.printStackTrace();
}
}
}
如果能找到一个对象的class文件,我们可以进行反序列化操作.如果找不到class文件,则抛出ClassNotFoundException 异常。
当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改, 那么反序列化操作也会失败,抛出一个InvalidClassException异常.可在序列化类(对象)添加private static final long serialVersionUID = 1L;,就可以被反序列化
网友评论