文档章节

Serializable

剧与
 剧与
发布于 2016/11/18 15:49
字数 635
阅读 84
收藏 1

「深度学习福利」大神带你进阶工程师,立即查看>>>

1. 序列化和反序列化

将对象转换为字节序列的过程称为对象的序列化。 反过来,将字节序列恢复成对象的过程称为对象的反序列化。

2. 为什么要用序列化

2.1当我们需要将内存中的对象存储到一个文件\数据库中的时候 通常我们需要将某些对象进行序列化,让它离开内存空间,入驻物理硬盘,以便长期保存,需要的时候在调取它。例如:缓存,我们需要将缓存存储起来,需要的时候再将它取出来。 2.2需要在网络上传送对象的时候 当两个进程在进行远程通信时,彼此时间需要发送数据,无论哪种类型的数据,都会以二进制序列的形式在网络上传送。

3. 实例

3.1创建User对象并实现Serializable接口


public class User implements Serializable{

	/** 序列ID */
	private static final long serialVersionUID = 8364239647574512618L;

	private Integer id;
	
	private String name;
	

3.2写测试代码

package test;

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 org.junit.Test;
import model.User;


public class TestUserSerializable {

	@Test
	public void test() throws InstantiationException, IllegalAccessException {
		//序列化
		this.UserSerializable();
		//反序列化
		User user=this.UnUserSerialiable();
		System.out.println(user);
	}
	
	
	/**
	 * 序列化User对象
	 * 
	 * 1.通过反射创建对象
	 * 
	 * 2.创建对象输出流,调用writeObject(Object obj)方法
	 * 
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 */
	public void UserSerializable() throws InstantiationException,IllegalAccessException{

		User user=new User();
		try {
			//通过反射创建User对象
			Class<?> clazz=Class.forName("model.User");
			user=(User) clazz.newInstance();
			user.setId(1);
			user.setName("张三");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		ObjectOutputStream oos=null;
		try {
			StringBuffer path=new StringBuffer();
			String str="E:\\Test\\";
			File file=new File(str);
			if (!file.exists()) {
				file.mkdirs();
			}
			path=path.append(str).append("User.txt");
			//创建对象输出流
			//将序列化的user存入E:\Test\User.txt
			oos=new ObjectOutputStream(new FileOutputStream(path.toString()));
			oos.writeObject(user);
			System.out.println("对象序列化成功!");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	public User UnUserSerialiable() throws InstantiationException,IllegalAccessException{
		
		User user=new User();
		ObjectInputStream ois=null;
		try {
			//反序列化
			ois=new ObjectInputStream(new FileInputStream(new File("E:\\Test\\User.txt")));
			try {
				user=(User) ois.readObject();
				System.out.println("反序列化成功!");
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return user;
		
	}
}

测试结果

4. serialVersionUID的作用

Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

4.1通过Test单独测试UserSerializable(注释serialVersionUID)

输入图片说明 输入图片说明

4.2修改User属性,这时再反序列化

增加age属性 测试结果

剧与

剧与

粉丝 16
博文 47
码字总数 42737
作品 0
成都
高级程序员
私信 提问
加载中
请先登录后再评论。
[用事实说明两个凡是]一个由mysql事务隔离级别造成的问题分析

背景 最近要做一个批跑服务, 基本逻辑就是定时扫描数据库的记录, 有满足条件的就进行处理(一条记录代表一个任务,以下任务与记录含义相同). 要求支持多机部署批跑服务. 批跑支持多机部署实现方...

周翼翼
2015/11/24
3.8K
44
MyBatis学习手记(二)MyBatis缓存机制

MyBatis学习手记二 前:MyBatis官方学习(中文)文档 http://mybatis.github.io/mybatis-3/zh/index.html 一,首先,要使用MyBatis必须使用官方提供的MyBatis的JAR包 链接:https://github.com...

xiaolei123
2015/09/15
2K
4
Redis将Session 集中管理

在分布式系统中.前提是分布式或者集群环境,常常需要多个系统中,保持Session .nginx可以配置IP的hash,实现每次都访问同一台应用容器,从而不需要共享Session ,也有tomcat的复制.虽然tomcat等容...

ParkJun
2016/02/22
1.2W
31
以C#语言为例讨论几种.NET的深复制方法

一、写在前面 深复制需要将对象实例中字段引用的对象也进行复制,在平时的编程工作中经常要用到这种复制方式,因为很多时候我们复制一个对象实例A到实例B,在用实例B去做其他事情的时候,会对...

北风其凉
2016/07/07
1.7K
7
session 共享与监控框架 - bboss-session

bboss session 框架,为 web 应用提供 session 共享和 session 监控功能。主要功能: 支持集群 session 共享 支持跨域跨应用 session 共享 提供强大的统一 session 管理监控和统计查询功能 ...

bboss
2017/01/10
2.7K
1

没有更多内容

加载失败,请刷新页面

加载更多

使用旁路输出(side output)来拆分和复制流

  我们在处理数据的时候,有时候想对不同情况的数据进行不同的处理,那么就需要把流进行拆分或者复制。 如果是使用filter来进行拆分,也能满足我们的需求,但每次筛选都要保留整个流,然后...

osc_ct0tt1cu
57分钟前
18
0
Azure AD 与 AWS IAM 集成实现SSO—上(Azure部分)

整体的架构和流程是下面这个样子: Azure部分: 登录Azure的portal通过Azure Active Directory创建一个测试用户: 返回Azure Active Directory 创建新的应用程序 Amazon Web Service 搜索 Am...

osc_bgs3qxk5
59分钟前
0
0
Azure AD 与 AWS IAM 集成实现SSO—下(AWS部分)

再回顾一下架构,我们都要做什么,别乱: 看来在AWS上做的工作要多一些。 登录AWS控制台: 进入到IAM这个服务: 在配置提供程序中,选择SAML,提供商名称自定义,比如WAAD,将刚才下载的元数...

osc_ibuoui1c
今天
0
0
AWS DevOps 通过Config自动审计Security Group配置——上篇

这个实验的一个场景是,运维同事设计安全组Security Group的时候,打开了除了HTTP和HTTPS的入口访问权限。其他协议或端口如果打开,除了审计不通过的同时,会自动触发一个函数将它修改成我们...

osc_l330x9u1
今天
3
0
AWS DevOps 通过Config自动审计Security Group配置——下篇

再讲一下背景, 这个实验的一个场景是,运维同事设计安全组Security Group的时候,打开了除了HTTP和HTTPS的入口访问权限。其他协议或端口如果打开,除了审计不通过的同时,会自动触发一个函数...

osc_cudh2wh2
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部