java序列化

        1、Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。

2、将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。

3、如果我们想要序列化一个对象,首先要创建某些OutputStream(FileOutputStreamByteArrayOutputStream),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用ReaderWriter等基于字符的层次结构)。而反序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(FileInputstreamByteArrayInputStream)封装在ObjectInputStream内,然后调用readObject()即可。

    4、序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。这也可能是造成序列化和反序列化失败的原因,因为不同的序列化id之间不能进行序列化和反序列化。

 

 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
 * @FileName Student.java
 * @Description:
 *
 * @Date 2016年3月4日
 * @author Administroter
 * @version 1.0
 * 
 */
public class Student implements Serializable{
 private static final long serialVersionUID = 1L;
 private String name = "张三";
 private int age = 24;
 public static void main(String[] args) {
  // 以下代码实现序列化,输出流保存的文件名为my.out。ObjectOutputStream能把Object输出成Byte流
  try {
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("F:/my1.out"));
   Student student = new Student();
   oos.writeObject(student);
   oos.flush(); // 缓冲流
   oos.close(); // 关闭流
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  fan();// 调用下面的 反序列化 代码
 }
 public static void fan()// 反序列的过程
 {
  ObjectInputStream oin = null;// 局部变量必须要初始化
  try {
   //获取序列化后的二进制文件数据
   oin = new ObjectInputStream(new FileInputStream("F:/my1.out"));
  } catch (FileNotFoundException e1) {
   e1.printStackTrace();
  } catch (IOException e1) {
   e1.printStackTrace();
  }
  Student student = null;
  try {
   //将获取的数据转成对象
   student = (Student) oin.readObject();// 由Object对象向下转型为Student对象
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  System.out.println("name=" + student.name);
  System.out.println("age=" + student.age);
 }
}

 上面就是个简单java序列化的测试。复制进去就可以测试了,可以看到序列化后的数据,是一串完全看不懂的内容,这是因为在序列化之后,会将对象转成byte流。调用下面的反序列化后,又将这些byte流转成我们的对象了。而且序列化之前和反序列化之后的数据是一样的。

但在序列化的时候有个地方值得注意,那就是被static和transient修饰后的变量是不能被序列化的。

总结下:

1、当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

2、当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

3、static,transient后的变量不能被序列化;

你可能感兴趣的:(java序列化,Serializable,反序列化)