文档章节

Serializable

只道寻常
 只道寻常
发布于 2016/11/18 15:49
字数 635
阅读 12
收藏 1
点赞 0
评论 0

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属性 测试结果

© 著作权归作者所有

共有 人打赏支持
只道寻常
粉丝 10
博文 47
码字总数 37536
作品 0
成都
后端工程师
Kotlin , Parcelable 与 Serializable

注意:本文的示例,用的是Kotlin,代码逻辑模型是MVVM Parcelable 与 Serializable,是数据序列化的2种方式,他们的区别有2个: 其一,Parcelable性能上优于Serializable。Serializable是通过...

Sn__
04/23
0
0
Android Parcelable和Serializable的区别

Android Parcelable和Serializable的区别 本文主要介绍Parcelable和Serializable的作用、效率、区别及选择,关于Serializable的介绍见Java 序列化的高级认识。 1、作用 Serializable的作用是...

LiSteven
2013/01/15
0
0
Oracle Data Concurrency and Consistency一之Oracle事务隔离级别

越来越多的接触并发、吞吐量、锁、一致性等等问题,很多时候也经常听到一些说系统性能太低,加并发提高性能,这往往是泛泛之谈。 把握不清楚问题的症结、问题源,并发很有可能不仅对性能无益...

hawk682808
2013/11/27
0
0
[Android] Android Parcelable和Serializable的区别

一 序列化原因: 1.永久性保存对象,保存对象的字节序列到本地文件中; 2.通过序列化对象在网络中传递对象; 3.通过序列化在进程间传递对象。 二 至于选取哪种可参考下面的原则: 1.在使用内...

枫兮兮
2014/03/11
0
0
Android Parcelable接口

1、实现Parcelable就是为了进行序列化,那么,为什么要序列化? 1)永久性保存对象,保存对象的字节序列到本地文件中; 2)通过序列化对象在网络中传递对象; 3)通过序列化在进程间传递对象...

SRain215
2016/04/27
23
0
Android Parcelable和Serializable的区别(转载)

1、作用 Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为...

stefanliao
2013/01/05
0
0
把你的对象给别人,你猜他会不会要?

【威哥说】在编程中我们经常要传递数据,而在Android开发中不可避免要传输对象数据,所以,就有了序列化,在java中序列化要使用Serializable,Android中虽然也可以使用Serializable,但是Goo...

磨砺营
2016/09/11
13
0
Android中Parcelable接口用法

Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel。 Classes implementing the Parcelable interface must also have a static field ......

AlexMahoneFBI
2015/03/09
0
0
Android的Serializable 和 Parcelable 区别

android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。 一 序列化原因: 1.永久性保存对象,保存对象的字节序列到本地文件中; 2.通过序列化对象在网络中...

冯京宝
2012/08/31
0
0
Android Intent传值 Serializable Parcelable

Intent传值,使用putExtra()时所支持的数据类型是有限的。使用Intent传递对象通过Serializable和Parcelable方式实现。 一. Serializable方式: Serializable是序列化的意思,表示将一个对象转...

SRain215
2016/02/04
111
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6用的外库遇到的问题

要用到wmi库 pip install wmi 装后不能用还要安装pywin32库。 要用到crypto加密模块安装pip instal pycrypto装后不能用。要安装pycryptodome。...

oisan_
3分钟前
0
0
select, poll, epoll I/O复用介绍

什么是I/O复用? 内核监视多个文件描述符(I/O文件句柄),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。 I/O多路复用又被称为“事件驱动”(比如读写事...

xiaoxlm
4分钟前
0
0
【Spring 系列 给IOC容器添加组件的几种方式总结】

给Spring 注册Bean的几种方式总结。其中使用@Import注解是Spring Boot 完成自动配置的一个核心注解。 1、Spring 中给IOC容器添加组件的几种方式 在Spring的配置文件中,配置Bean(基于XML方式...

HansonReal
5分钟前
2
0
bootstrapTable语言包设置

###方法一引入不同的语言包 <script src="bootstrap-table-zh-CN.js"></script> ###方法二引入全语言包 <script src="bootstrap-table-locale-all.min.js"></script>//然后在初始化前设计默......

momo1987
5分钟前
0
0
Saltstack 常用命令

1、拷贝文件到客户端 # salt 'slaver.test.com' cp.get_file salt://apache.sls /tmp/cp.txt 2、拷贝目录到客户端 # salt 'slaver.test.com' cp.get_dir salt://test /tmp 3、显示存活的客户......

硅谷课堂
6分钟前
0
0
致初学者-如何学好Python这门编程语言?[图]

致初学者-如何学好Python这门编程语言?[图]: 对于很多Python3初学者,往往会面临以下问题:Python2和Python3我该学习哪一个?是否要安装Linux系统学习Python?Python3有各种版本我该安装哪...

原创小博客
9分钟前
1
0
E31---setopt=protected_multilib=false

今天在云服务器上装nginx,需要先安装一些依赖库比如zlib, ,但是安装zlib时候报错。 yum install -y zlib zlib-devel 1 (-y 指的是如果需要选yes no的自动y)下面是报错 Protected multil...

侠客行之石头
13分钟前
0
0
HTTP常见面试题

Http与Https的区别: HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 HTTP 是不安全的,而 HTTPS 是安全的 HTTP 标准端口是80 ,而 HTTPS 的标准端口是443 在OSI 网络模型中,H...

JK_OPERA
15分钟前
0
0
python爬取站长素材网页图片保存到ppt中

网站地址:http://sc.chinaz.com/tupian/index.html 直接上代码: import requestsfrom bs4 import BeautifulSoupfrom pptx import Presentationfrom pptx.util import Inchesimpor......

你为什么不吃药
16分钟前
1
0
Ubuntu 18.04 swap空间的修改

一、准备工作 执行“sudo swapon -s”命令,查看是否已经存在swap file 二、修改swap file # 如果第一步存在swapfile则需要先禁用sudo swapoff /swapfile# 修改swap 空间的大小为2Gs...

Iceberg_XTY
19分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部