java的序列化与反序列化

打印 上一主题 下一主题

主题 539|帖子 539|积分 1617

一、定义

Java序列化和反序列化:
序列化就是指把Java对象转换为字节序列的过程。(比方将一个类转化为json范例)
反序列化就是指把字节序列恢复为Java对象的过程。
在Java现实运用中,,许多方面应用序列化反序列化——长期化、通信、缓存、消息队列等。(这个过程是在 JVM 中独立完成的,可以依赖于 Java 的可移植性)
        序列化最重要的作用:在通报和保存对象时.保证对象的完整性和可通报性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
        反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重修对象。
 在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。

二、序列化时需要用到:

1.Serializable接口
        当一个类实现了这个接口时,代表这个类可以被JVM序列化和反序列化。
        序列化是将对象状态转换为可以传输或存储的格式的过程,反序列化则是将格式还原为对象的过程。
        实现Serializable接口的类必须谨慎管理类布局的变动,以确保序列化和反序列化的兼容性。
2.serialVersionUID属性
        是类的一个静态成员变量,标识类的版本。
        当类的布局发生变动时,如果没有设置serialVersionUID,JVM会根据类的布局主动天生一个默认值。
        为了确保序列化的兼容性,通常我们会手动设置一个固定的serialVersionUID值。这样即使类布局变动,只要serialVersionUID稳固,序列化和反序列化就可以保持兼容。
3.transient关键字
        这个关键字可以修饰类的成员变量。
        被transient修饰的变量在序列化时会被忽略,不参与序列化和反序列化过程。(常用在不需要序列化一些敏感信息或者临时数据)
三、Java代码示例序列化

  1. package com.hollis;
  2. import java.io.Serializable;
  3. import java.util.Date;
  4. public class User implements Serializable{
  5.     private String name;
  6.     private int age;
  7.     private Date birthday;
  8.     private transient String gender;
  9.     private static final long serialVersionUID = -6849794470754667710L;
  10.     public String getName() {
  11.         return name;
  12.     }
  13.     public void setName(String name) {
  14.         this.name = name;
  15.     }
  16.     public int getAge() {
  17.         return age;
  18.     }
  19.     public void setAge(int age) {
  20.         this.age = age;
  21.     }
  22.     public Date getBirthday() {
  23.         return birthday;
  24.     }
  25.     public void setBirthday(Date birthday) {
  26.         this.birthday = birthday;
  27.     }
  28.     public String getGender() {
  29.         return gender;
  30.     }
  31.     public void setGender(String gender) {
  32.         this.gender = gender;
  33.     }
  34.     @Override
  35.     public String toString() {
  36.         return "User{" +
  37.                 "name='" + name + ''' +
  38.                 ", age=" + age +
  39.                 ", gender=" + gender +
  40.                 ", birthday=" + birthday +
  41.                 '}';
  42.     }
  43. }
复制代码
  1. package com.hollis;
  2. import org.apache.commons.io.FileUtils;
  3. import org.apache.commons.io.IOUtils;
  4. import java.io.*;
  5. import java.util.Date;
  6. public class SerializableDemo {
  7.     public static void main(String[] args) {
  8.         //初始化
  9.         User user = new User();
  10.         user.setName("zhangsan");
  11.         user.setGender("male");
  12.         user.setAge(20);
  13.         user.setBirthday(new Date());
  14.         System.out.println(user);
  15.         //写到File
  16.         ObjectOutputStream oos = null;
  17.         try {
  18.             oos = new ObjectOutputStream(new FileOutputStream("tempFile"));
  19.             oos.writeObject(user);
  20.         } catch (IOException e) {
  21.             e.printStackTrace();
  22.         } finally {
  23.             IOUtils.closeQuietly(oos);
  24.         }
  25.         //从File读
  26.         File file = new File("tempFile");
  27.         ObjectInputStream ois = null;
  28.         try {
  29.             ois = new ObjectInputStream(new FileInputStream(file));
  30.             User newUser = (User) ois.readObject();
  31.             System.out.println(newUser);
  32.         } catch (IOException e) {
  33.             e.printStackTrace();
  34.         } catch (ClassNotFoundException e) {
  35.             e.printStackTrace();
  36.         } finally {
  37.             IOUtils.closeQuietly(ois);
  38.             try {
  39.                 FileUtils.forceDelete(file);
  40.             } catch (IOException e) {
  41.                 e.printStackTrace();
  42.             }
  43.         }
  44.     }
  45. }
复制代码


总结


1、在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化(要想将父类对象也序列化,就需要让父类也实现Serializable 接口,)
2、通过IO类ObjectOutputStream和ObjectInputStream,中的writeObject()、readObject()方法 ,对对象举行序列化及反序列化
3、假造机是否答应反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID)
4、Transient 关键字的作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
5、序列化并不保存静态变量。
6、常用于文件和数据库的长期化、通信、缓存、消息队列等


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表