Java 对象的序列化和反序列化

 

一.序列化和反序列化的概念

 

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

 

      把对象转换为字节序列的过程称为对象的序列化。

      把字节序列恢复为对象的过程称为对象的反序列化。

      对象的序列化主要有两种用途:

      1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

      2) 在网络上传送对象的字节序列。

      在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

      当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

 

二.JDK库类中的序列化API

      java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

      java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

     只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

      对象序列化包括如下步骤:

      1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

      2) 通过对象输出流的writeObject()方法写对象。

      对象反序列化的步骤如下:

      1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;  

      2) 通过对象输入流的readObject()方法读取对象。

 

 

三.对象序列化和反序列化案例

      定义一个Person类,实现Serializable接口

 

import java.io.Serializable;
/*** 测试对象序列化和反序列化* @author * @version 1.0 V* @createTime */
public class Person implements Serializable {/*** 序列化ID*/private static final long serialVersionUID = -5809782578272943999L;private int age;private String name;private String sex;public int getAge() {return age;}public String getName() {return name;}public String getSex() {return sex;}public void setAge(int age) {this.age = age;}public void setName(String name) {this.name = name;}public void setSex(String sex) {this.sex = sex;}
}

 

      序列化和反序列化Person类对象

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.MessageFormat;
/*** 测试对象的序列化和反序列* @author * @version 1.0 V* @createTime */
public class TestObjSerializeAndDeserialize {public static void main(String[] args) throws Exception {SerializePerson();//序列化Person对象Person p = DeserializePerson();//反序列Perons对象System.out.println(MessageFormat.format("name={0},age={1},sex={2}",p.getName(), p.getAge(), p.getSex()));}/*** MethodName: SerializePerson * Description: 序列化Person对象* @author * @throws FileNotFoundException* @throws IOException*/private static void SerializePerson() throws FileNotFoundException,IOException {Person person = new Person();person.setName("gacl");person.setAge(25);person.setSex("男");// ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("E:/Person.txt")));oo.writeObject(person);System.out.println("Person对象序列化成功!");oo.close();}/*** MethodName: DeserializePerson * Description: 反序列Perons对象* @author * @return* @throws Exception* @throws IOException*/private static Person DeserializePerson() throws Exception, IOException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("E:/Person.txt")));Person person = (Person) ois.readObject();System.out.println("Person对象反序列化成功!");return person;}
}

 


 

 

 

转自:https://my.oschina.net/xsh1208/blog/532086

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

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

相关文章

家长必看 父母须知孩子社交圈九要点(组图)

孩子在慢慢的长大,总要接触外面的环境、接触到更多的人,也需要自己的社交圈。那么孩子的社交圈父母要知道9点。 1、妈妈是第一个“好朋友” 孩子社交的第一步从出生就开始了。虽然小小的他躺在那里还不能说话,但是通过哭、目光接触、笑等表…

2020-4-1

题目一 页面加载图片的时候&#xff0c;可能由于各种原因导致加载失败。 为了页面的人性化&#xff0c;在失败的时候通常会使用一张给定的图片替代。 <img src"logo.gif" onerror"javascript:this.srcdefault.gif" > //上面代码本来要加载logo.gif…

kettle变量(param命名参数)

1、定义&#xff1a; 编辑-设置-命名参数 在当前界面下定义参数名称和缺省值。 2、引用&#xff1a;原始数据 通过${var}引用变量 输出 注&#xff1a;1、字符串在命名参数引用是需要添加单引号的&#xff0c;但位置参数是不需要进行转译&#xff1b; 2、引用变量时需要勾选替换…

Excel操作

区间范围计算 方法一:用IF函数 方法二:构建一个辅助区域&#xff0c;用VLOOKUP函数 方法一:用IF函数 在F3中输入:IF(E3>90%,5%,IF(E3>80%,4%,IF(E3>70%,3%,IF(E3>60%,2%,1%)))) 向下拖动,搞定。 示例&#xff1a; IF(BB2<0.5,"50及以下",IF(AND(BB2&g…

2020-4-2

题目一 利用事件冒泡原理实现了获取td单元格内容的功能。 <!DOCTYPE html> <html> <head> <meta charset" utf-8"> <style type"text/css"> #table{ width:300px; height:100px; border:1px solid #ccc; border-c…

(一)prometheus与grafana介绍与安装

#&#xff08;1&#xff09;prometheus介绍 prometheus是一款 强大的监控系统和时序系统 采集数据&#xff1a; 在目标主机上安装exporter, exporter组件会在目标处收集监控数据, 并暴露一个http接口供prometheus查询, prometheus通过pull的方式来采集数据; 目前exporter已经采…

git 报错:was cached in the local repository, resolution will not be reattempted until the upda

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Could not resolve dependencies for project com.foreveross:gaei-syncpm:jar:0.0.1-SNAPSHOT: Failure to find com.oracle.jdbc:ojd…

6000个边缘Kubernetes节点驱动城市80万次智能停车,如何成为可能?

城市的街道因为汽车数量的增长越来越繁忙&#xff0c;对于驾车一族而言&#xff0c;在热门区域寻找停车场更是无比头痛的事情。然而与此同时&#xff0c;其实也许很多办公楼、住宅楼、酒店和公共车库中仍有许多付费停车的资源未被充分利用。 ParkBee就是这样一家为城市提供智能…

python 进程与线程(理论部分)

一、理论部分 一 什么是进程 进程&#xff1a;正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 举例&#xff08;单核多道&#xff0c;实现多个进程的并发执行&#xff09;&#xff1a; egon在一个时间段内有很多任务要做&#xff1a;python备课的任务&#xff0c;…

Maven : 将 Jar 安装到本地仓库和 Jar 上传到私服

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Jar的maven配置 <dependency><groupId>org.apache.thrift</groupId><artifactId>libthrift</artifactId&g…

sql 中 between 的边界问题 ---- between 边界:闭区间,not between 边界:开区间

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 BETWEEN 用以查询确定范围的值&#xff0c;这些值可以是数字&#xff0c;文本或日期 。BETWEEN 运算符是闭区间的&#xff1a;包括开始…

取代ZooKeeper!高并发下的分布式一致性开源组件StateSynchronizer

StateSynchronizer是开源分布式流存储平台Pravega的核心组件。StateSynchronizer组件以stream为基础&#xff0c;对外提供一致性状态共享服务。StateSynchronizer允许一组进程同时读写同一共享状态而不必担心一致性问题。本文将从共享状态和一致性的角度出发&#xff0c;详细描…

Linux基础学习导图

网上教程太多啦&#xff0c;先水一波导图&#xff0c;笔记日后慢慢上传~ 一款常用的软件很简单易用&#xff0c;推荐大家下载xmind vim学习相关的思维导图&#xff1a; 可以通过ubuntu自带的vim书学习&#xff08;终端输入vimtutor&#xff09;

mysql 查外键关联关系 (指定被引用表,查哪些表对其有外键引用)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在一个业务功能中要求先清空一张基础表&#xff08;user表&#xff09;再插入一批新数据。 在删除过程中报错为其它表有外键引用&#…

docker 4 section

镜像和容器的关系&#xff1a; 镜像是容器的基础&#xff0c;每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。我们可以使用的都是来自于 Docker Hub 的镜像。直接使用这些镜像是可以满足一定的需求&#xff0c;而当这些镜像无法直接满足需求时&#xff0c;我们…

精读《V8 引擎 Lazy Parsing》

1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing&#xff0c;看看 V8 引擎为了优化性能&#xff0c;做了怎样的尝试吧&#xff01; 这篇文章介绍的优化技术叫 preparser&#xff0c;是通过跳过不必要函数编译的方式优化性能。 2. 概述 & 精读 解析 Js 发生在网页运行的关键…

Git和SVN的区别,Git的使用方法大全

什么是Git: Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布…

BUAA-OO 第二单元作业“电梯调度”总结与思考

一、需求分析 利用java线程的相关知识实现 1&#xff09;单部多线程傻瓜调度&#xff08;FAFS&#xff09;电梯 2&#xff09;单部多线程可捎带调度&#xff08;ALS&#xff09;电梯 3&#xff09;多部多线程智能&#xff08;SS&#xff09;调度电梯 二、思路分析 1、基于度量的…

递归实现进制转换(C++版)

上次呢&#xff0c;我们留下了一道题&#xff0c;今天我们来一起看一看&#xff1a; 题目链接&#xff1a;https://www.cnblogs.com/gaozirong/p/10547434.html 这是我写的程序&#xff0c;大家可以对照参考一下&#xff08;C&#xff09;&#xff1a; #include<bits/stdc.h…

IDEA 错误:找不到或无法加载主类

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 从昨天开始使用IDEA开始就一直在搭建java环境&#xff0c;许久没有使用过java&#xff0c;刚开始有些生疏&#xff0c;先建了一个最简单…