文档章节

理解java中的序列化与反序列化

阳光黑马
 阳光黑马
发布于 2015/04/21 13:40
字数 609
阅读 27
收藏 0

涉及的JDK API:

ObjectOutputStream()  writeObject(obj)  序列化

ObjectInputStream()  readObject()   反序列化

默认的序列化方式:实现Serializable接口

序列化:

定义:将对象及其信息转换为可存储或者传输形式的过程。

常见形式:序列化为文件,序列化为字节流等

作用:易于网络上传输或者存储到硬盘

代码示例:

@org.junit.Test
    public void test5(){
        ObjectOutputStream stream=null;
        try {//序列化到d:/a.obj
            stream = new ObjectOutputStream(new FileOutputStream("d:/a.obj"));
            Per per = new Per();
            stream.writeObject(per);
            stream.close();
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        } 
    }

反序列化:

定义:将其他信息还原为java对象的过程。

代码示例:

@org.junit.Test
    public void test6(){
        ObjectInputStream ins=null;
        try {//反序列化
            ins=new  ObjectInputStream(new FileInputStream("d:/a.obj"));
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
        try {
            Per p=(Per)ins.readObject();
            System.out.println(p);
        } catch (IOException e) {
        } catch (ClassNotFoundException e) {
        }
    }

注意:

只有实现了Serializable接口或者Externalizable接口的类的对象才会被序列化。

静态的变量不会被序列化:因为静态变量属于类级别的。可能有时候实验会发现似乎也被序列化了,那是个假象,因为有可能是把序列化的过程和反序列化的过程写在了一个方法里,那么那个具有静态变量的类还是加载了的,所以。。

使用transient修饰的变量不会被序列化。

默认的反序列化不会调用任何的构造方法

控制序列化与反序列化,可以再类中写

private void writeObject(java.io.ObjectOutputStream out) throws IOException

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;

作用是:比如序列化是有些内容较敏感,可以再writeObject中进行处理。。。。

 

完全由类来控制序列化与反序列化:实现Externalizable接口

void writeExternal(ObjectOutput out) throws IOException

void readExternal(ObjectInput in) throws IOException , ClassNotFoundException

注意:此中方式反序列化时,会先调用类的不带参数的构造方法,如果没有了或者级别不正确,则会报错。

 

可序列化类的不同版本的序列化兼容性问题:

显示的定义serialVersionUID,带来的好处:

1 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID

2)在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID

 

http://www.2cto.com/kf/201312/264301.html

© 著作权归作者所有

共有 人打赏支持
阳光黑马
粉丝 9
博文 21
码字总数 11705
作品 0
海淀
程序员
私信 提问
Android Serializable与Parcelable原理与区别

一、序列化、反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。 对象的反序列化:把字节序列恢复为Java对象的过程。 (2) 序列化详细解释 ...

KingMing
2015/04/16
0
0
Java序列化之Serializable

1.需求 1.什么是Java序列化 2.详解 1.序列化 理解为"打碎"即可 2.在书本上序列化的意思是将Java对象转为二进制 3.java平台允许我们在内存中创建对象,当JVM运行时对象才能存在,如果JVM停止,对...

村长大神
2018/05/08
0
0
Java序列化与JSON序列化大比拼

一、背景 有项目需要传输Map结构的数据,有人倾向用Java序列化来做,有人倾向用JSON的序列化来做。所以我们还是比比吧。 Java观点:Object2Object,使用时简单快速。 JSON观点:JSON格式与语...

NoahX
2013/03/10
0
20
为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

2018/06/10
0
0
java RMI 源码总结(个人理解)

明天早上详细写下两个过程: 1、初始化过程(服务器) 2、客户端调用过程(包括客户端流程、调用服务端流程、返回客户端流程) 当客户端通过RMI注册表找到一个远程接口的时候,所得到的其实是...

Java搬砖工程师
2018/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
32分钟前
2
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
2
0
day24:文档第五行增内容|每月1号压缩/etc/目录|过滤文本重复次数多的10个单词|人员分组|

1、在文本文档1.txt里第五行下面增加如下内容;两个方法; # This is a test file.# Test insert line into this file. 分析:给文档后增加内容,可以用sed 来搞定;也可以用while do done...

芬野de博客
昨天
2
0
深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
昨天
2
0
MVC、MVCS、MVVM、MVP、VIPER等这么多架构模式哪一个好呢?

在项目开启阶段,其中一个很重要的环节就是选架构。 那么面对目前已知的这么多架构模式我们该怎么选择呢?这确实是个很让人头疼的问题! 下面我就在这里梳理一下目前常见的一些架构模式。 先...

Java干货分享
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部