序列化与反序列化介绍

概述

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。

特点/应用场景

在这里插入图片描述
在序列化期间,对象将其当前状态写入到临时或持久性存储区。
以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化:利用ObjectOutputStream,对象的信息,按固定格式转成一串字节值输出并持久保存到磁盘化。
反序列化:利用ObjectInputStream,读取磁盘中序列化数据,重新恢复对象。

  1. 需要序列化的文件必须实现Serializable接口以启用其序列化功能。
  2. 不需要序列化的数据可以被修饰为static的,由于static属于类,不随对象被序列化输出。
  3. 不需要序列化的数据也可以被修饰为transient临时的,只在程序运行期间,在内存中存在不会被序列化持久保存。
  4. 在反序列化时,如果和序列化的版本号不一致时,无法完成反序列化。
  5. 每个被序列化的文件都有一个唯一id,如果没有添加编译器会根据类的定义信息计算产生一个版本号。
  6. 常用于服务器之间的数据传输,序列化成文件,反序列化读取数据。
  7. 常用于使用套接字流在主机之间传递对象。

ObjectOutputStream

ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。

ObjectOutputStream(OutputStream out) 
          创建写入指定 OutputStream 的 ObjectOutputStream。
void writeObject(Object obj)
          将指定的对象写入 ObjectOutputStream。

ObjectInputStream

ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

ObjectInputStream(InputStream in)
          创建从指定 InputStream 读取的 ObjectInputStream。
Object readObject()
      从 ObjectInputStream 读取对象,读取序列化数据。

练习1:将学生信息序列化至磁盘【序列化】

package cn.tedu.seri;
 
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;
 
//对象的序列化反序列化
public class Test3_Serializable {
       public static void main(String[] args) {
//           method();//对象的序列化
              method2();//对象的反序列化
       }
       //对象的反序列化:指从磁盘中加载被序列化过的文件,变成Java对象的过程  -- 读取
       //要求:1、类必须有可序列化的标志,实现接口    2、可序列化的类必须有唯一的versionId才能反序列化成功
       private static void method2() {
              try {
                     //1、创建ObjectInputStream对象
                     ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\teach\\1.txt"));
                    
                     //2、反序列化--恢复成Student对象
                     Student s = (Student) in.readObject();//-向下转型-把父类类型转成子类类型-强转
                     System.out.println(s);//默认显示地址值,重写toString()看属性值
             
                     //3、关闭资源
                     in.close();
                    
              } catch (Exception e) {
                     e.printStackTrace();
              }
       }
      
       //对象的序列化:指把程序中产生的对象永久保存到磁盘中 -- 写出
       private static void method() {
              try {
                     //1、创建Student对象
                     Student s = new Student("jack",20,"BJ","java");
                    
                     //2、序列化
                     ObjectOutputStream out =
                                   new ObjectOutputStream(new FileOutputStream("D:\\teach\\1.txt"));
                     out.writeObject(s);
                    
                     //3、关闭资源
                     out.close();
                    
              } catch (Exception e) {
                     e.printStackTrace();
              }
             
       }
}
//创建Student类
//4、想要完成序列化,类必须有标志,实现序列化接口,接口里是空实现,只是用来做标志
class Student implements Serializable{
      
       private static final long serialVersionUID = 1L;
 
       //构造方法:source-倒数第三个-ok
       public Student() { }
       public Student(String name, int age, String addr, String subject) {
              super();
              this.name = name;
              this.age = age;
              this.addr = addr;
              this.subject = subject;
       }
      
       private String name;
       private int age;
       private String addr;
       private byte gender;
       private String subject;
       private byte snum;
 
       //get()/set()
       public String getName() {
              return name;
       }
       public void setName(String name) {
              this.name = name;
       }
       public int getAge() {
              return age;
       }
       public void setAge(int age) {
              this.age = age;
       }
       public String getAddr() {
              return addr;
       }
       public void setAddr(String addr) {
              this.addr = addr;
       }
       public byte getGender() {
              return gender;
       }
       public void setGender(byte gender) {
              this.gender = gender;
       }
       public String getSubject() {
              return subject;
       }
       public void setSubject(String subject) {
              this.subject = subject;
       }
       public byte getSnum() {
              return snum;
       }
       public void setSnum(byte snum) {
              this.snum = snum;
       }
      
       //默认显示地址值,重写toString()看属性值
       @Override
       public String toString() {
              return "Student [name=" + name + ", age=" + age + ", addr=" + addr + ", gender=" + gender + ", subject="
                            + subject + ", snum=" + snum + "]";
       }
      
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值