博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java序列化和serialVersionUID(转)
阅读量:6072 次
发布时间:2019-06-20

本文共 2330 字,大约阅读时间需要 7 分钟。

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

转载于:https://www.cnblogs.com/cornucopia/p/4513608.html

你可能感兴趣的文章
ethereum/EIPs-158 State clearing 被EIP-161取代
查看>>
np.mgrid的用法
查看>>
html 富文本编辑器相关--中文状态下输入@的问题
查看>>
在这里给大家安利一个好的免费的虚拟主机云服务器使用地址
查看>>
Linux下使用wc统计文件行数
查看>>
java.lang.UnsupportedClassVersionError: com/T : Unsupported major.minor version问题解决
查看>>
【GO】golang 方法的值调用和指针调用
查看>>
Devexpress ChartControl 柱状图简单例子
查看>>
n元线性方程非负整数解的个数问题
查看>>
技术题目收集整理
查看>>
想象力比知识更重要么?提出问题比解决问题更重要?
查看>>
iOS边练边学--父子控制器之自定义控制器的切换
查看>>
八个防止浪费时间的小窍门
查看>>
^ 转义字符
查看>>
java面向对象入门之带参方法创建
查看>>
Eclipse反编译插件jad的安装
查看>>
动态加载swiper,默认显示最后一个swiper-slide
查看>>
css 让一张彩色的图片变成一张黑白图
查看>>
Git介绍和基本原理
查看>>
后缀数组 3160 最长公共子串
查看>>