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

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

如果一个类,实现了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();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值