文档章节

java的序列化

 郭里奥
发布于 2017/09/11 19:07
字数 757
阅读 17
收藏 0
点赞 0
评论 0

1.什么是序列化?

序列化就是将JVM当中正在运行的信息以字节信息表示

2.对象序列化?

对象序列化就是JVM中的对象信息(static ,transient 修饰的变量不会被序列化)以字节形式展示,使用ObjectInputStream或ObjectOutputStream操作实体类时应实现Serializable接口,使用XMLEncoder或XMLDecoder时,可以不实现该接口

3.什么时候使用序列化?

对象数据的持久化或对象数据的网络传输

下面就几个例子进行介绍:

一.进行序列化:

1.使用ObjectOutputStream序列化

    /**
	 * @param obj
	 *            需要被序列化的对象
	 * @param uri
	 *            序列化存储的目标位置包括文件名
	 * @return 将存储的结果文件返回
	 */
	public static File writeObject(List<Object> list, String uri)
	{
		File file = new File(uri);
		ObjectOutputStream out = null;
		OutputStream fout = null ;
		try
		{
			if (!file.exists())
				file.createNewFile();
			fout = new FileOutputStream(file,true);
			if(file.length() < 1){
				out = new ObjectOutputStream(fout);
			}else{
				out = new MyObjectOutputStream(fout);
			}
			for(Object obj : list){
				out.writeObject(obj);
			}
			out.flush();
		} catch (IOException e)
		{
			e.printStackTrace();
		} finally
		{
			if (out != null)
			{
				try
				{
					out.close();
				} catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		}
		return file;
	}	

	//支持多次写入序列化结果写入同一文件
	static class MyObjectOutputStream extends ObjectOutputStream{

		protected MyObjectOutputStream() throws IOException, SecurityException
		{
			super();
			
		}
		public MyObjectOutputStream(OutputStream out) throws IOException {
			  super(out);
		}
		@Override
		protected void writeStreamHeader() throws IOException {
			  return;
		} 
		
	}

2.使用XMLEncoder序列化

    /**@param uri 目标文件路径及文件名
	 * @param obj 需要被序列化的对象
	 * @return 将序列化后的结果返回
	 * 使用java.beans.XMLEncode的类将对象序列化为XML格式的文件*/
	public static File xmlEncode(String uri ,List<Object> list){
		File file = new File(uri);
		XMLEncoder encode = null ;
		try{			
			encode = new XMLEncoder(new FileOutputStream(file,true),"utf-8",false,0);			
			for(Object each : list){
				encode.writeObject(each);
			}
			encode.flush();
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			if(encode != null){
				encode.close();
			}			
		}
		return file;
	}

二.反序列化

1.使用ObjectInputStream

    /**
	 * @param file 需要反序列化的文件
	 * @return person 反序列化后得到对象,反序列化是不会调用该类的构造器
	 */
	public static List<Object> readObject(File file)
	{
		ObjectInputStream in = null;
		List<Object> list = new ArrayList<Object>();
		try
		{
			in = new ObjectInputStream(new FileInputStream(file));
			while(true){
				Object obj = in.readObject();
				list.add(obj);
			}
		} catch ( ClassNotFoundException e)
		{
			e.printStackTrace();
		} 
		catch(EOFException e){
			System.out.println("文件到达末尾");
			e.printStackTrace();
		}
		catch(IOException e){
			e.printStackTrace();
		}finally
		{
			// 关闭资源
			if (in != null)
			{
				try
				{
					in.close();
				} catch (IOException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return list;
	}

2.使用XMLDecoder

     /**
	 * @param uri 将uri目标位置文件反序列化为一个对象
	 * @return 将反序列后的结果返回,会调用该类的无参构造函数,当该类没有无参的构造函数时,抛出java.lang.InstantiationException异常
	 * 所以要使用该方法进行反序列化时该类需要有无参的构造方法
	 * */
	public static List<Object> xmlDecode(String uri ){
		XMLDecoder decode = null ;
		File file = new File(uri);
		List list = new ArrayList();
		try{
			FileInputStream fin = new FileInputStream(file);
			Object obj = null ;
			decode = new XMLDecoder(fin);
			while((obj = decode.readObject()) != null){
				list.add(obj);
			}			
		}catch(FileNotFoundException e){
			e.printStackTrace();
		}catch (IOException e)
		{
			e.printStackTrace();
		}catch(ArrayIndexOutOfBoundsException e){
			e.printStackTrace();
		}finally{
			if(decode != null){
				decode.close();
			}
		}
		return list ;
	}

附加:本次试用的实体类

public class Person implements Serializable
{
	/**
	 * @author 郭暸
	 *
	 *
	 */
	private static final long serialVersionUID = -6922946081862337047L;
	private String name ;
	private transient Sex sex;
	private int age ;
	public Person(){
		
	}
	public String getName()
	{
		return name;
	}
	public Sex getSex()
	{
		return sex;
	}
	public int getAge()
	{
		return age;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public void setSex(Sex sex)
	{
		this.sex = sex;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
 
    @Override
	public String toString(){
		return "name:"+this.name+"\tage:"+this.age+"\tsex:"+this.sex;
	}
	
}

 

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 9
码字总数 5466
作品 0
西安
程序员
Java序列化技术即将被废除!!!

我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术。Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将二进制数据...

Java技术栈 ⋅ 05/30 ⋅ 0

甲骨文称 Java 序列化的存在是个错误,计划删除

甲骨文计划从 Java 中去除序列化功能,因其在安全方面一直是一个棘手的问题。 Java 序列化也称为 Java 对象序列化,该功能用于将对象编码为字节流...Oracle 的 Java 平台小组的首席架构师 Ma...

达尔文 ⋅ 05/28 ⋅ 0

Java序列化之Serializable

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

村长大神 ⋅ 05/08 ⋅ 0

Java反序列化漏洞的原理分析

  *本文原创作者:Moonlightos,本文属FreeBuf原创奖励计划,未经许可禁止转载   世界上有三件事最难:      把别人的钱装进自己的口袋里   把自己的想法装进别人的脑袋里   让自...

FreeBuf ⋅ 05/04 ⋅ 0

为什么我墙裂建议大家使用枚举来实现单例

我们知道,单例模式,一般有七种写法,那么这七种写法中,最好的是哪一种呢?为什么呢?本文就来抽丝剥茧一下。 哪种写单例的方式最好 在StakcOverflow中,有一个关于What is an efficient ...

冷_6986 ⋅ 06/13 ⋅ 0

为什么我墙裂建议大家使用枚举来实现单例。

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

⋅ 06/10 ⋅ 0

大数据学习之(Storm)-原理详解!

角色 Client client的主要作用是提交topology到集群 Worker Worker是运行在Supervisor节点上的一个独立的JVM进程,主要作用是运行topology,一个topology可以包含多个worker,但一个worker只...

qq5af153121eb2c ⋅ 05/08 ⋅ 0

spring-boot-starter-grpc 实现原理

RPC 流程 1、服务调用方(Client)将远程方法的信息(如类名、方法方法名、方法传入的参数)封装为统一的请求体; 2、序列化请求对象,转化为二进制串,方便传输; 3、通过 Client Stub 发送...

Anoyi ⋅ 05/20 ⋅ 0

5月份值得一看的 Java 技术干货!

5月又即将要离我们远去了,这个月有小长假51劳动节,有54青年节,有513母亲节,更有坑爹的520神马节?!! 废话不说,又到了总结上个月干货的时候了,这个月我们带来了各种Java技术干货,都是...

Java技术栈 ⋅ 05/31 ⋅ 0

memcache java 客户端与c#客户端 数据不一致问题

使用 memcache 我在.net 里使用 enyim.caching 缓存。 在java 里使用 spymemcached 读取 不到,但是控制台都可以看到。 后来了解到,每个memcache 有一个flag,不同的客户端 不同。 我修改了...

2J ⋅ 05/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

C++内存映射文件居然是这样?!

内存映射文件大家都时不时听过,但它到底是个什么?赶紧来看看吧 内存映射文件到底是干嘛的呢?让我们先来思考下面几个问题: 如果您想读的内容大于系统分配的内存块怎么办?如果您想搜索的字...

柳猫 ⋅ 28分钟前 ⋅ 0

MySQL 数据库设计总结

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节...

OSC_cnhwTY ⋅ 今天 ⋅ 0

多线程(四)

线程池和Exector框架 什么是线程池? 降低资源的消耗 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3 提高线程的可管理性。 线程池要做些什...

这很耳东先生 ⋅ 今天 ⋅ 0

使用SpringMVC的@Validated注解验证

1、SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 [java] view plain copy edit.userna...

瑟青豆 ⋅ 今天 ⋅ 0

19.压缩工具gzip bzip2 xz

6月22日任务 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍: linux中常见的一些压缩文件 .zip .gz .bz2 .xz .tar .gz .tar .bz2 .tar.xz 建立一些文...

王鑫linux ⋅ 今天 ⋅ 0

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 今天 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 今天 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 今天 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 今天 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部