java序列化和serialVersionUID的使用方法实例

 更新时间:2017年08月07日 14:30:16   投稿:lqh  
这篇文章主要介绍了java序列化和serialVersionUID的使用方法实例的相关资料,这里说明很详细的使用方法让你彻底学会,需要的朋友可以参考下

java序列化和serialVersionUID的使用方法实例

1、序列化:

序列化可以将一个java对象以二进制流的方式在网络中传输并且可以被持久化到数据库、文件系统中,反序列化则是可以把之前持久化在数据库或文件系统中的二进制数据以流的方式读取出来重新构造成一个和之前相同内容的java对象。  

 2、序列化的作用:

第一种:用于将java对象状态储存起来,通常放到一个文件中,使下次需要用到的时候再读取到它之前的状态信息。 

第二种:可以让java对象在网络中传输。  

 3、序列化的实现:

1)、需要序列化的类需要实现Serializable接口,该接口没有任何方法,只是标示该类对象可被序列化。 

2)、序列化过程:使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态) 

3)、反序列化过程:使用一个输入流(如:FileInputStream)来构造一个ObjectInputStream(对象流)对象,接着,使用ObjectInputStream对象的readObject(Object obj)方法就可以将参数为obj的对象读出(即获取其状态)  

 4、静态long类型常量serialVersionUID的作用:

如果没有设置这个值,你在序列化一个对象之后,改动了该类的字段或者方法名之类的,那如果你再反序列化想取出之前的那个对象时就可能会抛出异常,因为你改动了类中间的信息,serialVersionUID是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,当修改后的类去反序列化的时候发现该类的serialVersionUID值和之前保存在问价中的serialVersionUID值不一致,所以就会抛出异常。  

而显示的设置serialVersionUID值就可以保证版本的兼容性,如果你在类中写上了这个值,就算类变动了,它反序列化的时候也能和文件中的原值匹配上。而新增的值则会设置成null,删除的值则不会显示。  

 5、例子:

package com.sxit; 
 
import java.io.File; 
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 Serializable01 extends Object implements Serializable{ 
 
  private static final long serialVersionUID = -1466479389299512377L; 
   
  public byte b = 12; 
   
  public byte getB() { 
    return b; 
  } 
 
  public void setB(byte b) { 
    this.b = b; 
  } 
 
  public static void main(String[] args) { 
     
    try { 
      FileOutputStream fos = new FileOutputStream(new File("E:\\tmp\\demo2.txt")); 
      ObjectOutputStream os = new ObjectOutputStream(fos); 
      Serializable01 s = new Serializable01(); 
       
      os.writeObject(s); 
      os.flush(); 
      os.close(); 
       
      FileInputStream fis = new FileInputStream(new File("E:\\tmp\\demo2.txt")); 
      ObjectInputStream ois = new ObjectInputStream(fis); 
       
      Serializable01 s2 = (Serializable01)ois.readObject(); 
      System.out.println(s2.getB()); 
      ois.close(); 
       
    } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

 6、序列化特点:

1)、如果一个类可被序列化,其子类也可以,如果该类有父类,则根据父类是否实现Serializable接口,实现了则父类对象字段可以序列化,没实现,则父类对象字段不能被序列化。 

2)、声明为transient类型的成员数据不能被序列化。transient代表对象的临时数据; 

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

以上就是java序列化和serialVersionUID的讲解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 实例分析Java Class的文件结构

    实例分析Java Class的文件结构

    今天把之前在Evernote中的笔记重新整理了一下,发上来供对java class 文件结构的有兴趣的同学参考一下
    2013-04-04
  • java类Circle定义计算圆的面积和周长代码示例

    java类Circle定义计算圆的面积和周长代码示例

    要用Java计算圆的周长和面积,需要使用圆的半径和一些数学公式,下面这篇文章主要给大家介绍了关于java类Circle定义计算圆的面积、周长的相关资料,需要的朋友可以参考下
    2024-04-04
  • spring boot + mybatis实现动态切换数据源实例代码

    spring boot + mybatis实现动态切换数据源实例代码

    这篇文章主要给大家介绍了关于spring boot + mybatis实现动态切换数据源的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • SpringBoot如何获取application.properties中自定义的值

    SpringBoot如何获取application.properties中自定义的值

    这篇文章主要介绍了SpringBoot获取application.properties中的自定义的值,目录结构文件代码给大家列举的非常详细,需要的朋友可以参考下
    2021-09-09
  • 浅析Java中的SPI原理

    浅析Java中的SPI原理

    SPI:由调用方制定接口标准,实现方来针对接口提供不同的实现,SPI其实就是"为接口查找实现"的一种服务发现机制。本文将浅谈一下SPI机制的原理,需要的可以参考一下
    2022-09-09
  • Java中List排序的3种常见方法总结

    Java中List排序的3种常见方法总结

    在Java编程中List对象的排序是一个常见的需求,List接口提供了多种排序方法,这篇文章主要给大家介绍了关于Java中List排序的3种常见方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Spring MVC实现的登录拦截器代码分享

    Spring MVC实现的登录拦截器代码分享

    这篇文章主要介绍了Spring MVC实现的登录拦截器代码分享,涉及拦截器的简单介绍,拦截器和过滤器的区以及拦截器实现代码等相关内容,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • 基于Java ActiveMQ的实例讲解

    基于Java ActiveMQ的实例讲解

    下面小编就为大家带来一篇基于Java ActiveMQ的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • @DS注解的使用,动态数据源,事务详解

    @DS注解的使用,动态数据源,事务详解

    在项目中使用多数据源时,可以借助苞米豆的dynamic-datasource-spring-boot-starter进行配置,首先需引入相应的jar包,并在application.yml中设置主从数据源,其中一般选择master作为默认数据源,在实现类中通过@DS注解指定数据源
    2024-09-09
  • Java中遍历Map集合的5种方式总结

    Java中遍历Map集合的5种方式总结

    这篇文章主要给大家介绍了关于Java中遍历Map集合的5种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论