`
m635674608
  • 浏览: 4906142 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java序列化和serialVersionUID 总结

    博客分类:
  • java
 
阅读更多
import java.io.Serializable;





public class BoardBean implements Serializable{
	private static final long serialVersionUID = 1L;

	
}

public class BoardView extends BoardBean {
	//private static final long serialVersionUID = 2L;

}
当一个类有父类有
serialVersionUID 
子类没有重写serialVersionUID ,那么jvm会自动生成一个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的使用方法实例

    主要介绍了java序列化和serialVersionUID的使用方法实例的相关资料,这里说明很详细的使用方法让你彻底学会,需要的朋友可以参考下

    java序列化实现演示

    Java序列化机制(2)- serialVersionUID 实验 http://blog.csdn.net/suileisl/article/details/16991753

    序列化版本号serialVersionUID的作用_动力节点Java学院整理

    序列化版本号serialVersionUID的作用_动力节点Java学院整理.

    什么是Java的序列化和反序列化?如何实现对象的序列化和反序列化?(java面试题附答案).txt

    通过实现 Serializable 接口,Java对象可以被序列化和反序列化。序列化可以将对象转换为字节流,以便于存储或传输。反序列化则可以将字节流重新转换为原始对象。需要注意的是,序列化和反序列化的类必须具有相同的 ...

    3分钟读阿里Java手册: 序列化

    前言 下面这句代码,相信大家可能跟我一样都非常熟悉,但是真正了解的人又有多少呢? private static final long serialVersionUID = 1L;...Java序列化保留了对象类的元数据(类、继承类等),以及对象数据,兼容性好

    序列化和反序列化1

    序列化ID 两个类的序列化ID相同才能保证反序列的对象是一致private static final long serialVersionUID在序列化过程中,

    JAVA基础,常见java基础问题.rar

    2.接口和抽象类有什么区别 接口不能有方法实现,也就是说接口的方法都是抽象方法,但抽象类可以有方法实现。...序列化的实现一般是通过实现Serializable接口,并且会有一个serialVersionUID,这个ID叫做序列化ID

    从根上读懂阿里手册 | 为啥不能轻易修改serialVersionUID字段

    阿里巴巴开发手册,(四)OOP 规约,第 13 条解释如下: 【强制】序列化类新增属性时,请...首先我们需要了解一下序列化,我们可以简单了理解序列化就是把 Java 对象转换成另一种形态的数据,这种形态的数据可以用于

    Stephenerialization:Java 跨版本序列化问题的解决方案。-开源

    当尝试在不同版本的类之间进行序列化时,Java 的内置序列化不足。 使用静态 serialVersionUID 是一个好的开始,但还不够。 如果您想要解决 Java 序列化问题,那就别无所求! Stephenerialization 使您可以轻松地在...

    java8集合源码-Java:Java

    Java中序列化和反序列化的区别。 什么是SerialVersionUID? 内部类和子类的区别。 JSON 相对于 XML 的优势是什么? 我们可以两次导入相同的包/类吗? JVM 会在运行时加载包两次吗? 静态加载和动态类加载的区别? ...

    Java关键字—-transient

    本篇文章序列化、反序列化用的类是同一个类,可以通过注释main中1然后修改Stu类实现有无transient关键字修饰、serialVersionUID是否不同,得到以下结果: 1、serialVersionUID的数值大小不会影响序列化后的字节数...

    Serializable-master.zip

    1.serialVersionUID-->适用于Java的序列化机制: 2.具体化序列化过程: 3.serialVersionUID有两种显示的生成方式:

    java-lt:关于flink的一些测试

    idea 设置 java 类无序列化 id 警告 File--> Settings--> Editor--> Inspections--> Java--> Serialization issues--> 将 Serializable class without serialVersionUID 勾选 idea jihuoma #ssh ...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    D .POJO类的serialVersionUID不一致会抛出序列化运行时异常。 多选 9.关于Java的接口描述,下列哪些说法符合《阿里巴巴Java开发手册》:BCD A .在接口类中的方法和属性使用public修饰符。 B .对于Service类,...

    memcached1

    对基本的数据我们可以操作,对于普通的POJO而言,如果要进行存储的话,那么比如让其实现java.io.Serializable接口,因为memcached是一个分布式的缓存服务器,多台服务器间进行数据共享需要将对象序列化的,所以必须...

    SerialVer task for ANT-开源

    SerialVer将Java serialver功能添加到Apache-Jakarta的ANT工具中。 该项目在可序列化类的源代码中添加了Tasks和FilterReaders来获取,插入和修改serialVersionUID。

    @SuppressWarnings

    serial 当在可序列化的类上缺少 serialVersionUID 定义时的警告。 finally 任何 finally 子句不能正常完成时的警告。 all 关于以上所有情况的警告。 @SuppressWarnings 批注允许您选择性地取消特定代码段(即,类或...

    基于Spring的HttpInvoker实现改写egova_invoker.zip

    ProxyFactory.proxy 方法,生成接口的代理对象,直接调用方法客户端和服务器端的接口和实体类要一致,实体类必须是可以序列化的比如:定义Bean: public class DemoBean implements java.io.Serializable{ ...

Global site tag (gtag.js) - Google Analytics