java序列化流_java 序列化流与反序列化流

一 对象序列化流ObjectOutputStream

ObjectOutputStream 将Java对象的基本数据类型和图形写入OutputStream。可以使用ObjectInputStream

读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。

注意:只能将支持 java.io.Serializable 接口的对象写入流中

用于从流中读取对象的

操作流 ObjectInputStream    称为 反序列化流

用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流

特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

4d37a1a8c04055a747039aa6ae778a91.png

9e8fd7f217353e5ba923dcb311b5b340.png

public classObjectStreamDemo {public static void main(String[] args) throwsIOException, ClassNotFoundException {/** 将一个对象存储到持久化(硬盘)的设备上。*/writeObj();//对象的序列化。

}public static void writeObj() throwsIOException {//1,明确存储对象的文件。

FileOutputStream fos = new FileOutputStream("tempfile\\obj.object");//2,给操作文件对象加入写入对象功能。

ObjectOutputStream oos = newObjectOutputStream(fos);//3,调用了写入对象的方法。

oos.writeObject(new Person("wangcai",20));//关闭资源。

oos.close();

}

}

public class Person implementsSerializable {privateString name;private intage;publicPerson() {super();

}public Person(String name, intage) {super();this.name =name;this.age =age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@OverridepublicString toString() {return "Person [name=" + name + ", age=" + age + "]";

}

}

二 对象反序列化流ObjectInputStream

ObjectInputStream 对以前使用ObjectOutputStream写入的基本数据和对象进行反序列化。支持

java.io.Serializable接口的对象才能从流读取。

3414e96f548eaecff1b1063399f1c1d9.png

4a7eba9b07c9f9f2f97625c987271d2d.png

public classObjectStreamDemo {public static void main(String[] args) throwsIOException, ClassNotFoundException {

readObj();//对象的反序列化。

}public static void readObj() throwsIOException, ClassNotFoundException {//1,定义流对象关联存储了对象文件。

FileInputStream fis = new FileInputStream("tempfile\\obj.object");//2,建立用于读取对象的功能对象。

ObjectInputStream ois = newObjectInputStream(fis);

Person obj=(Person)ois.readObject();

System.out.println(obj.toString());

}

}

三 序列化接口

当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException

异常。

同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常

InvalidClassException。发生这个异常的原因如下:

该类的序列版本号与从流中读取的类描述符的版本号不匹配

该类包含未知数据类型

该类没有可访问的无参数构造方法

Serializable标记接口。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID.该版本号的目的在于

验证序列化的对象和对应类是否版本匹配。

代码修改如下,修改后再次写入对象,读取对象测试

public class Person implementsSerializable {//给类显示声明一个序列版本号。

private static final long serialVersionUID = 1L;privateString name;private intage;publicPerson() {super();

}public Person(String name, intage) {super();this.name =name;this.age =age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@OverridepublicString toString() {return "Person [name=" + name + ", age=" + age + "]";

}

}

四 瞬态关键字transient

当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient修饰。

只要被transient修饰了,序列化时这个属性就不会序列化了。

同时静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。

代码修改如下,修改后再次写入对象,读取对象测试

public class Person implementsSerializable {/** 给类显示声明一个序列版本号。*/

private static final long serialVersionUID = 1L;private staticString name;private transient/*瞬态*/ intage;publicPerson() {super();

}public Person(String name, intage) {super();this.name =name;this.age =age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@OverridepublicString toString() {return "Person [name=" + name + ", age=" + age + "]";

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【spring boot】注解@ApiParam @PathVariable @RequestParam三者区别

1.ApiParam,就是用于swagger提供开发者文档,文档中生成的注释内容。 ApiOperation( value "编辑公告", notes "编辑公告", httpMethod "POST" )RequestMapping( value "/edit", method RequestMethod.POST…

Zookeeper Watch监听

概述 ZooKeeper -server host:port cmd args stat path [watch] ls path [watch] ls2 path [watch] get path [watch] watch监听有不同的类型,有监听状态的stat ,内容的get,目录结构的ls。 命令使用一次,只监听…

win10文件显示后缀名_win10系统,如何去除“此电脑” 里的6个多余文件夹

Windows系统从XP到win7,再到进化到如今的win10,在系统性能和使用便捷性方面,确实改进了很多,但是,金无赤足,没有完美的东西,总是有一些小细节让我们感觉不舒服,如如鲠在喉。比如我们下面看到的这…

ubuntu sun-java6-jre_在 Ubuntu Lucid 下请回 Sun Java6 Jre, 赶走 OpenJDK

Ubuntu Lucid 将 sun-java6-jre 系列包移出了源,java软件用 openjdk系列包提供支持。然而在某些软件(比如FreeRapid)的使用中,openjdk还是喜欢出一些莫名其妙的错误(比如栈溢出),因此考虑请回sun-java6-jre。具体方法很简单,首先添…

数字化工厂的五大系统_如何搭建以MES系统为核心的数字化工厂?

MES强调车间级的过程集成、控制和监控,以及合理地配置和组织所有资源。满足车间信息化需要,提高车间对随机事件的快速响应和处理能力,有力地促进企业信息化进程向车间层拓展。通过构建以“精益生产、智能制造”为特点的车间管理系统&#xff…

zookeeper数据结构及Znode类型

结构 1、层次化的目录结构,命名符合常规文件系统规范 2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识。 3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点)。 4、客户端应用可以在节点上设置监视器…

Windows10下手工强制清理删掉安装版的JRE8导致java.exe无法运行的解决办法

error:could not open xxxx.jvm.cfg 参考:https://blog.csdn.net/u010102493/article/details/18425267 1.搜索并删掉C:\Windows\System32下:java*.exe 仍然不行: 在WIN10的开始菜单搜索java C:\ProgramData\Oracle\Java下还有一些东西。 确认…

设计企业网站大纲_企业网站设计布局

网站制作一年350元,五站合一,快速建站 ,www.sxjcwzjs.com,只需进入网站右上角注册快速建站即可(需要电脑登录注册),需要联系我吧!电话:13752214574,微信号:m1078582894企业网站布局很…

python画子图_Python使用add_subplot与subplot画子图操作示例

本文实例讲述了Python使用add_subplot与subplot画子图操作。分享给大家供大家参考,具体如下:子图:就是在一张figure里面生成多张子图。Matplotlib对象简介FigureCanvas 画布Figure 图Axes 坐标轴(实际画图的地方)注意&#…

vue导入静态js_如何在vue js中加载静态图像

我有一个组件,它接受一个prop字符串,即一个url。它可以是远程图片,也可以是资产文件夹中的本地静态资产。目录结构:-assets/- logo.png-app.vue-components/-ImageTest.vue图像测试.vue{{imagelink}}export default {name: "ImageTest",props:{imagelink: String,},c…

Zookeeper JavaApi 增删改查

官网API http://zookeeper.apache.org/doc/r3.4.6/api/index.html JAR包 \zookeeper-3.3.6\lib\ jline-0.9.94.jar \zookeeper-3.3.6\lib\ log4j-1.2.15.jar \zookeeper-3.3.6\ zookeeper-3.3.6.jar Demo代码 注意代码中的注解 package hello.zookeeper.api;import java.uti…

搭建linux测试环境有什么用_谈谈现在搭建网站用什么程序好,选择对的程序是很重要的开头...

目前可以选择的网站程序还是蛮多的,开源的系统也很多,也有很多精品。更多时候,选择网站程序要结合网站的定位。说说dedecms,就是我们都知道的织梦程序,功能很齐全,作为一个简单的资讯门户网站,算…

python练习笔记——利用信号signal处理僵尸进程

1 signal处理僵尸进程的基于语法 利用信号signal处理僵尸进程的方法:signal(SIGCHLD,SIG_IGN),该方法也是第三种处理僵尸进程的方法。 SIGCHLD:子进程状态改变后产生此信号,父进程需要调用一个wait函数以确定发生了什么。 1&#…

Zookeeper应用:服务端上下线

需求 客户端感知服务器的上下线。 示意图 步骤 服务端: 1、所有机子向Zookeeper注册,注册znode为临时的。 2、有机子下线,连接断开后被Zookeeper自动删除,触发监听事件。 3、有机子上线,触发监听事件。 客户端&am…

哈希表查找失败的平均查找长度_你还应该知道的哈希冲突解决策略

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA作者:Xuegui Chen哈希是一种通过对数据进行压缩, 从而提高效率的一种解决方法,但由于哈希函数有限,数据增大等缘故,哈希…

hive 创建访问用户_hive创建角色并赋权

1 角色管理命令1.1 创建角色创建一个新角色,需要 admin 用户执行CREATE ROLE role_name;1.2 删除角色删除一个角色,需要 admin 用户执行DROP ROLE role_name;1.3 显示当前角色显示用户当前角色列表SHOW CURRENT ROLES;1.4 设定角色如果指定了role_name&a…

python 正则替换_5分钟速览Python正则表达式常用函数!五分钟就掌握它!

导读:正则表达式是处理字符串类型的"核武器",不仅速度快,而且功能强大。本文不过多展开正则表达式相关语法,仅简要介绍python中正则表达式常用函数及其使用方法,以作快速查询浏览。01 Re概览Re模块是python的…

MFC鼠标OnMouseHover使用

ON_WM_MOUSEHOVER消息要生效,要配合ON_WM_MOUSEMOVE一起使用.代码如下:void CYuButton::OnMouseMove(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值TRACKMOUSEEVENT tme { 0 };tme.cbSize sizeof(TRACKMOUSEEVENT);tme.dwFlags TME_HOVER…

oracle 分组_大数据分组怎样才会更快

分组是数据库的常见运算,无论数据如何准备,通常都需要将所有数据遍历。建立索引这时是不起作用的,存储格式才是决定遍历效率的主要因素。数据库中数据的存放虽然是二进制格式的,但普遍IO性能差,库内遍历快,…

java下拉树_参数模板中下拉树级联下拉数据集查询

背景说明在参数表单的制作中会遇到各种各样的需求,如为了方便参数的输入,需要将输入框设计成树状;若参数模板中有两个输入框,每个输入框对应的参数有某种关系,前一个输入框输入参数后,后一个输入框自动关联…