java序列化和serialVersionUID

转载 2016年05月31日 15:34:38

java序列化和serialVersionUID             

1、序列化:

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

 2、序列化的作用:

Java代码 复制代码 收藏代码
  1. 第一种:用于将java对象状态储存起来,通常放到一个文件中,使下次需要用到的时候再读取到它之前的状态信息。  
  2. 第二种:可以让java对象在网络中传输。  

 3、序列化的实现:

Java代码 复制代码 收藏代码
  1. 1)、需要序列化的类需要实现Serializable接口,该接口没有任何方法,只是标示该类对象可被序列化。  
  2. 2)、序列化过程:使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态)  
  3. 3)、反序列化过程:使用一个输入流(如:FileInputStream)来构造一个ObjectInputStream(对象流)对象,接着,使用ObjectInputStream对象的readObject(Object obj)方法就可以将参数为obj的对象读出(即获取其状态)  

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

Java代码 复制代码 收藏代码
  1. 如果没有设置这个值,你在序列化一个对象之后,改动了该类的字段或者方法名之类的,那如果你再反序列化想取出之前的那个对象时就可能会抛出异常,因为你改动了类中间的信息,serialVersionUID是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,当修改后的类去反序列化的时候发现该类的serialVersionUID值和之前保存在问价中的serialVersionUID值不一致,所以就会抛出异常。  
  2.   
  3.   
  4. 而显示的设置serialVersionUID值就可以保证版本的兼容性,如果你在类中写上了这个值,就算类变动了,它反序列化的时候也能和文件中的原值匹配上。而新增的值则会设置成null,删除的值则不会显示。  

 5、例子:

Java代码 复制代码 收藏代码
  1. package com.sxit;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.ObjectInputStream;  
  9. import java.io.ObjectOutputStream;  
  10. import java.io.Serializable;  
  11.   
  12. public class Serializable01 extends Object implements Serializable{  
  13.   
  14.     private static final long serialVersionUID = -1466479389299512377L;  
  15.       
  16.     public byte b = 12;  
  17.       
  18.     public byte getB() {  
  19.         return b;  
  20.     }  
  21.   
  22.     public void setB(byte b) {  
  23.         this.b = b;  
  24.     }  
  25.   
  26.     public static void main(String[] args) {  
  27.           
  28.         try {  
  29.             FileOutputStream fos = new FileOutputStream(new File("E:\\tmp\\demo2.txt"));  
  30.             ObjectOutputStream os = new ObjectOutputStream(fos);  
  31.             Serializable01 s = new Serializable01();  
  32.               
  33.             os.writeObject(s);  
  34.             os.flush();  
  35.             os.close();  
  36.               
  37.             FileInputStream fis = new FileInputStream(new File("E:\\tmp\\demo2.txt"));  
  38.             ObjectInputStream ois = new ObjectInputStream(fis);  
  39.               
  40.             Serializable01 s2 = (Serializable01)ois.readObject();  
  41.             System.out.println(s2.getB());  
  42.             ois.close();  
  43.               
  44.         } catch (FileNotFoundException e) {  
  45.             e.printStackTrace();  
  46.         } catch (IOException e) {  
  47.             e.printStackTrace();  
  48.         } catch (ClassNotFoundException e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.     }  
  52. }  

 6、序列化特点:

Java代码 复制代码 收藏代码
  1. 1)、如果一个类可被序列化,其子类也可以,如果该类有父类,则根据父类是否实现Serializable接口,实现了则父类对象字段可以序列化,没实现,则父类对象字段不能被序列化。  
  2. 2)、声明为transient类型的成员数据不能被序列化。transient代表对象的临时数据;  
  3. 3)、当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;  

Java对象的serialVersionUID在序列化和反序列化的用途

本博客主要转自如下链接 http://blog.csdn.net/javazejian/article/details/52665164 这篇文章写的不错,但是有些地方我估计博主没有亲自测试,所以有...
  • u011734144
  • u011734144
  • 2016年09月29日 12:44
  • 1553

Java中序列化的serialVersionUID作用

Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象。 序列化是Java中实现持久化存储的一种方法;为数据传输提供了线路级对象表示法。 Java的序列化机制是通过在运行...
  • z69183787
  • z69183787
  • 2015年07月10日 19:44
  • 3280

serialVersionUID 对序列化,反序列化的影响

说一下个人理解,如果有不对的,希望大家多多指点啊!如果一个类,实现了Serializable接口,则可以被序列化到本地。 此时,会有一个属性,serialVersionUID,来表示该实体类的版本。...
  • a770794164
  • a770794164
  • 2017年02月15日 17:03
  • 895

Java Serializable序列化,反序列化 ,serialVersionUID的作用

Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。如此可以把对象转换成字节流,可以进行网络传输,保持到本地文件,数据库等,增加对象的生命周...
  • chenchaofuck1
  • chenchaofuck1
  • 2016年03月07日 16:31
  • 1568

Java之序列化SerialVersionUID的作用

先总结下:          Serializable接口 标记类可以被序列化(ObjectOutputStream)和反序列化(ObjectInputStream) 暴露了类的内存代表二进制...
  • lqhed
  • lqhed
  • 2016年06月01日 15:35
  • 382

Java序列化与反序列化及serialVersionUID

Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨。 1.Java序列化与反序列化Java序列化是指把Java对象转换为字节序...
  • windneverstop
  • windneverstop
  • 2017年08月03日 10:42
  • 59

Java中serialVersionUID的解释及两种生成方式的区别

serialVersionUID作用:         序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 有两种生成方式:        一个是默认的1L,比如:priv...
  • anonymous6
  • anonymous6
  • 2014年05月05日 15:12
  • 2645

Java中序列化的serialVersionUID作用

Java中序列化的serialVersionUID作用 分类: Java开发2014-05-07 11:05 2452人阅读 评论(1) 收藏 举报      Java序列化是将一...
  • sanjiaozhen
  • sanjiaozhen
  • 2015年10月01日 10:37
  • 215

【Java基础】序列化之serialVersionUID

为什么需要serialVersionUID?序列化很大部分的作用是持久化到本地中,那么有个问题就是如果在还原也就是反序列化这些本地数据的时候,原先的类结构已经发生了改变,存在本地的数据代表着的是旧的数...
  • xude1985
  • xude1985
  • 2016年07月03日 10:38
  • 168

java中序列化的serialVersionUID解释

serialVersionUID: 字面意思上是序列化的版本号,这个在刚刚接触java编程时,学序列化大家一般都不会注意到,在你一个类序列化后除非你强制去掉了myeclipse中warning的功能,...
  • cselmu9
  • cselmu9
  • 2014年12月13日 11:58
  • 624
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java序列化和serialVersionUID
举报原因:
原因补充:

(最多只允许输入30个字)