关闭

java序列化和serialVersionUID

1087人阅读 评论(0) 收藏 举报
分类:

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)、当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;  
0
0
查看评论

Java中序列化的serialVersionUID作用

Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象。 序列化是Java中实现持久化存储的一种方法;为数据传输提供了线路级对象表示法。 Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把...
  • z69183787
  • z69183787
  • 2015-07-10 19:44
  • 3429

Intellij IDEA 自动生成 serialVersionUID

Setting->Inspections->Serialization issues->Serializable class without ’serialVersionUID’  选上以后,在你的class中:Alt+Enter就会提示自动创建serialVersion...
  • tiantiandjava
  • tiantiandjava
  • 2013-04-10 11:15
  • 88506

Java Serialization UID 问题的完美解决方案

================================================Java序列化中SUID问题的完美解决方案:================================================1.问题描述:一个老版本的object "hello....
  • chinayuan
  • chinayuan
  • 2006-12-01 13:58
  • 4929

lombok的使用和原理

一、项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省去我们手动创建getter和setter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成g...
  • DSLZTX
  • DSLZTX
  • 2015-07-01 22:24
  • 21493

Java之序列化SerialVersionUID的作用

先总结下:          Serializable接口 标记类可以被序列化(ObjectOutputStream)和反序列化(ObjectInputStream) 暴露了类的内存代表二进制数据,private的属性域不安全。默认的序列化将...
  • lqhed
  • lqhed
  • 2016-06-01 15:35
  • 428

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

本博客主要转自如下链接 http://blog.csdn.net/javazejian/article/details/52665164 这篇文章写的不错,但是有些地方我估计博主没有亲自测试,所以有些地方我亲测后发现其实他说的不对,大家可以先看看他写的,然后再看看我下面说的具体哪里不对了 先说说s...
  • u011734144
  • u011734144
  • 2016-09-29 12:44
  • 1633

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

说一下个人理解,如果有不对的,希望大家多多指点啊!如果一个类,实现了Serializable接口,则可以被序列化到本地。 此时,会有一个属性,serialVersionUID,来表示该实体类的版本。如果没有指定serialVersionUID: 当一个类被序列化后,如果发生了改变,不包括增加空格...
  • a770794164
  • a770794164
  • 2017-02-15 17:03
  • 1001

Java序列化--忽略serialVersionUID验证

import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectStreamClass; public class FakeObjectI...
  • expleeve
  • expleeve
  • 2014-04-20 20:45
  • 1252

关于Java Serial Version UID的一些说明

在网络传输Java对象、将Java对象存储到文件、将Java对象以BLOB形式存储到数据库中时,需要对Java对象进行序列化及反序列化,标准模式是实现Serializable接口。     实现上述接口时,需要提供一个Serial Version UID,该UID用于...
  • u012364372
  • u012364372
  • 2016-04-21 17:00
  • 1730

关于java/android 数据序列化后SerialVersionUID的获取

本人android 开发,遇到了一个关于数据序列化的坑,纪录下来以便以后查看。  所有需要序列化本地的bean都需要继承Serializable 否则无法序列化(如果不了解序列化的知识请自行百度)。  我继承了Serializable 但是没有设置SerialVersionUID...
  • a417348199
  • a417348199
  • 2016-09-18 17:40
  • 469
    个人资料
    • 访问:9404705次
    • 积分:78895
    • 等级:
    • 排名:第21名
    • 原创:264篇
    • 转载:2899篇
    • 译文:3篇
    • 评论:803条
    文章分类
    最新评论