首页 > 学院 > 开发设计 > 正文

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

2019-11-08 20:19:13
字体:
来源:转载
供稿:网友

说一下个人理解,如果有不对的,希望大家多多指点啊!

如果一个类,实现了Serializable接口,则可以被序列化到本地。 此时,会有一个属性,serialVersionUID,来表示该实体类的版本。

如果没有指定serialVersionUID: 当一个类被序列化后,如果发生了改变,不包括增加空格,换行,增加注释,等等,那么反序列化后,会抛出异常:java.io.InvalidClassException。 这是因为序列化的时候,如果没有指定serialVersionUID,Java序列化机制会根据编译的class(它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的)自动生成一个serialVersionUID作序列化版本比较用。 如果一个类发生修改,serialVersionUID则会发生改变。反序列的时候,JVM会把传来的字节流中的serialVersionUID与相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidClassException)。

如果指定了serialVersionUID: 如果序列化后,增加了属性或者方法,则反序列化的时候,不会抛异常,但是新增加的属性会被赋予对应类型的默认值,新增加的方法可以调用。 如果序列化后,删除了属性或者方法,则反序列化后,会忽略被删除的属性或方法。

具体实现的例子,参照的文章找不到原创作者,只能贴出参照时的地址: http://blog.csdn.net/zzjjiandan/article/details/32336079 在此贴出格式化后的测试用代码

测试用的实体类

package test;import java.io.Serializable;public class Serial implements Serializable { PRivate static final long serialVersionUID = 1L; int id; String name; String test; public Serial(int id, String name,String test) { this.id = id; this.name = name; this.test = test; } public String toString() { return "DATA: " + id + " " + name + " " + test; } public void add(){ System.out.println("add"); } /*public Serial(int id, String name) { this.id = id; this.name = name; } public String toString() { // return "DATA: " + id + " " + name + " " + test; return "DATA: " + id + " " + name; }*/}

序列化的类

package test;import java.io.FileOutputStream;import java.io.ObjectOutputStream;public class SerialTest { public static void main(String args[]) { //Serial serial1 = new Serial(1, "song"); Serial serial1 = new Serial(1, "song","aa"); System.out.println("Object Serial" + serial1); try { FileOutputStream fos = new FileOutputStream("serialTest.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(serial1); oos.flush(); oos.close(); } catch (Exception e) { e.printStackTrace(); } }}

反序列化的类

package test;import java.io.FileInputStream;import java.io.ObjectInputStream;public class DeserialTest { public static void main(String[] args) { // TODO Auto-generated method stub Serial serial2; try { FileInputStream fis = new FileInputStream("serialTest.txt"); ObjectInputStream ois = new ObjectInputStream(fis); serial2 = (Serial) ois.readObject(); ois.close(); System.out.println("Object Deserial" + serial2); serial2.add(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表