Java之序列化与反序列化

ObjectOutputStream

    对象中的数据,以流的形式,写入到文件中保存。这个过程称为写出对象,也叫对象的序列化

ObjectInputStream

    在文件中,以流的形式,将对象读取出来。这个过程叫读取对象,也叫对象的反序列化


1. 对象的序列化与反序列化

由于对象中的数据是没有规律的,所有只提供了字节流的形式,没有字符流的形式

定义一个Person测试对象:

public class Person {

    private String name;

    private int age;

    public Person() {}

    public Person(String name, int age) {

        super();

        this.name = name;

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    @Override

    public String toString() {

        return "Person [name=" + name + ", age=" + age + "]";

    }

    }


1.1. ObjectOutputStream

1.1.1. 构造方法

ObjectOutputStream(OutputStream out)


1.1.2. 将对象序列化写入文件 void writeObject(Object obj)

按照常规流程将对象序列化,发现报错

查看报错信息,提示NotSerializableException

查看API手册中该异常的描述  

提示说需要一个Serializable接口

接着查看Serializable接口描述

表明如果需要序列化,必须实现Serializable接口,否则会抛出异常,而且Serializable接口是没有任何抽象方法的,只需要implements一下就可以解决这个报错了!

因此Person类代码修改第一行如下:

public class Person implements Serializable{

再运行程序就没有异常报错了,且3个对象也序列化到了文件中

因此Serializable接口是一个标记性接口(没有任何抽象方法,但必须要implements一下)


1.2. ObjectInputStream

1.2.1. 构造方法

ObjectInputStream(InputStream in)


1.2.2. 读文件将对象反序列化到对象

必须要抛出CassNotFoundException异常,因为反序列化必须要有反序列对象的class文件,在本例中是Person.class文件


1.3 序列化、反序列化的常见问题

1.3.1 自定义的类的静态成员不能做序列化

这段测试代码,运行之前,先将Person中的age采用static修饰:private static int age;

运行程序,先调用objStreamWriteDemo(), 再调用objStreamReadDemo()

从结果来看,kluter的age显示的是leslin的age

原因是静态成员是类的,不属于对象。而对象序列化反序列化针对的是对象,不是类


1.3.2 瞬态关键字:transient

在1.3中静态成员的值不能够被序列化

使用关键字transient修饰age,阻止对象中的age成员的序列化

private transient int age;


1.3.3 序列化中序列号的冲突问题

在基本的Person类中,如果age成员先用private修饰,序列化到文件中

接着将Person的age成员用public修饰,运行从文件中反序列化时,程序会报错,报错第一行:

Exception in thread "main" java.io.InvalidClassException: com.gamebear.s1.Person; local class incompatible: stream classdesc serialVersionUID = 8738724770247792658, local class serialVersionUID = 4187457991494988290

可以看出是由于序列化之后生成的序列号,和反序列化生成的序列号产生了冲突。

当Person类加入implements Serializable时,eclispse编译器会自动帮你将java文件编程成class文件,在class文件中保存了这个序列号,且这个序列号只会在类序列化时才会生成

这样会导致在序列化时是一个序列号并写入了序列化文件中,而反序列化时是另一个序列号,从序列化文件读取出来的序列号和新的类的序列号进行对比如果相同则读取成功,如果不同则读取失败,报上面的错误



为了解决序列号冲突的问题,我们需要自定义序列号

在Person类中成员变量前加入一行, 且等号后面的数值可以随便改一个:

private static final long serialVersionUID = 8738724770247792658L;

这样即便是反序列化前修改了成员的属性也能读取成功了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容