文档章节

Java 序列化

1527
 1527
发布于 2016/05/12 13:08
字数 935
阅读 41
收藏 2
点赞 2
评论 0
package com.corejava.serializable;

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.ObjectInputStream.GetField;
import java.io.ObjectOutputStream;
import java.io.ObjectOutputStream.PutField;
import java.io.Serializable;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * <a href="http://www.runoob.com/java/java-serialization.html"/>
 * @author jerry
 *
 */
public class SerializableTest implements Serializable{

	private static final Logger log = LoggerFactory.getLogger(SerializableTest.class);
	
	/**
	 * 序列化对象
	 */
	@Test
	public void serializeObject(){
		
		Employee e = new Employee();
		e.name = "Reyan Ali";
		e.address="Phokka Kuan, Ambehta Peer";
		e.SSN=11122333;
		e.number=101;
		
		try {
			FileOutputStream fileOut = new FileOutputStream("e://test.txt");
			ObjectOutputStream out = new ObjectOutputStream(fileOut);
			out.writeObject(e);
			out.close();
			fileOut.close();
			log.info("保存成功");
			
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}
	
	/**
	 * 反序列化对象
	 */
	@Test
	public void deserializeObject(){
		
		try {
			ObjectInputStream in = new ObjectInputStream(new FileInputStream("e://test.txt"));
			Employee e = (Employee) in.readObject();
			in.close();
			log.info("name:"+e.name);
			log.info("address:"+e.address);
			log.info("SSN:"+e.SSN);
			log.info("Number:"+e.number);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * <a href="https://www.ibm.com/developerworks/cn/java/j-lo-serial/">
	 */
	/**
	 * 虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID   是否一致
	 */
	private static final long serialVersionUID = 1L;
	
	
	/**
	 * 序列化并不保存静态变量
	 */
	
	private static int  staticVar=5;
	@Test
	public void testStaticVarIsSerializable(){
		
		try{
			
			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("e://test.txt"));
			out.writeObject(new SerializableTest());
			out.close();
			
			SerializableTest.staticVar=10;
			ObjectInputStream in = new ObjectInputStream(new FileInputStream("e://test.txt"));
			SerializableTest t = (SerializableTest) in.readObject();
			in.close();
			
			//10
			System.out.println(t.staticVar);
			
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	/**
	 * 父类序列化:要想将父类对象也序列化,就需要让父类也实现Serializable 接口
	 * Transient关键字:作用是控制变量的序列化,在变量声明前加上该关键字,可以阻止该变量被序列化到文件中,
	 * 				 在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
	 */
	
	private String password="pass";

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	private void writeObject(ObjectOutputStream out){
		
		try {
			
			PutField  putFields = out.putFields();
			System.out.println("原密码:" + password);
			password = "encryption";//模拟加密
			putFields.put("password", password);
			System.out.println("加密后的密码:" + password);
			out.writeFields();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private void readObject(ObjectInputStream in) {
		try {
			GetField readFields = in.readFields();
			Object object = readFields.get("password", "");
			System.out.println("要解密的字符串:" + object.toString());
			password = "pass";//模拟解密,需要获得本地的密钥
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}
	
	/**
	 * 敏感字段加密
	 */
	@Test
	public void testEncipher(){
		
		ObjectOutputStream out;
		try {
			out = new ObjectOutputStream(
					new FileOutputStream("e://test.txt"));
			out.writeObject(new SerializableTest());
			out.close();

			ObjectInputStream oin = new ObjectInputStream(new FileInputStream(
					"e://test.txt"));
			SerializableTest t = (SerializableTest) oin.readObject();
			System.out.println("解密后的字符串:" + t.getPassword());
			oin.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (ClassNotFoundException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 存储规则
	 * 两次写入对象,文件大小会变为两倍的大小,反序列化时,由于从文件读取,生成了两个对象,判断相等时应该是输入 false 才对,但是最后结果113,118,true
	 * 
	 * -->Java 序列化机制为了节省磁盘空间,具有特定的存储规则,当写入文件的为同一对象时,并不会再将对象的内容进行存储,
	 * 而只是再次存储一份引用,上面增加的 5 字节的存储空间就是新增引用和一些控制信息的空间。
	 * 反序列化时,恢复引用关系,使得t1,t2指向唯一对象,二者相等。输出true
	 */
	@Test
	public void testStorageRule(){
		
		try {
			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("e://test.txt"));
			Employee test = new Employee();
			out.writeObject(test);
			out.flush();
			System.out.println(new File("e://test.txt").length());
			
			out.writeObject(test);
			out.flush();
			System.out.println(new File("e://test.txt").length());
			
			ObjectInputStream in = new ObjectInputStream(new FileInputStream("e://test.txt"));
			Employee t1 = (Employee) in.readObject();
			Employee t2 = (Employee) in.readObject();
			
			System.out.println(t1==t2);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	
}


package com.corejava.serializable;

import java.io.Serializable;

public class Employee implements Serializable{

	public String name;
	public String address;
	public transient int SSN;
	public int number;
	
	public void mailCheck(){
		
		System.out.println("Mailing a check to " + name
                + " " + address);
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public int getSSN() {
		return SSN;
	}
	public void setSSN(int sSN) {
		SSN = sSN;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	
	
}


 

© 著作权归作者所有

共有 人打赏支持
1527
粉丝 5
博文 85
码字总数 28850
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 14分钟前 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部