文档章节

Java 序列化

老渔民了
 老渔民了
发布于 2016/05/12 13:08
字数 935
阅读 47
收藏 2

行业解决方案、产品招募中!想赚钱就来传!>>>

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;
	}
	
	
}


 

老渔民了

老渔民了

粉丝 9
博文 121
码字总数 51620
作品 0
成都
程序员
私信 提问
加载中
请先登录后再评论。
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0
研究虚拟机--Jikes RVM

Jikes研究虚拟机(Jikes Research Virtual Machine,简称Jikes RVM)是一种成熟的用于执行Java程序的虚拟机,其早期版本与当前版本分别在通用公共许可证(CPL)与Eclipse公共许可证(EPL)下开...

匿名
2013/02/13
1.1K
0
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.4K
0
libqt4json

libqt4jon 是一个使用 Qt QVariant 对象的 JSON 序列化和反序列化库。可系列化原生类型如 integer, double, QString, lists, maps, and QObject recursively. 只序列化通过 QObject Q_PROPER...

匿名
2013/03/29
380
0
Java™ 编译器--Janino

Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,...

匿名
2013/04/02
4.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库高频面试点,事务/乐观锁/悲观锁/CAS/MySQL存储引擎

事务的ACID特性是什么? 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读...

osc_45536bvu
刚刚
0
0
大数据BI软件助力企业数字化转型

当下,「新基建」势头正盛,随着“新基建”成为热议话题,数字化也随之成为企业面临的新机遇和新挑战。新基建的核心就是数据,数据是数字经济和企业数字化转型的生产要素和发展动力。 再看看...

osc_0boqdoe2
2分钟前
0
0
凯旋创投来志刚:基因治疗新时代,大戏刚刚开始

  2017 年,全球第一个基因治疗方法 CAR-T 细胞药物 Kymriah 获得 FDA 上市批准,从此掀起了基因治疗的热潮。随着相关技术和政策的不断成熟,基因治疗市场也随之扩大。根据德勤发布的《引领...

osc_k3vwonkw
3分钟前
0
0
LightningChart.NET使用两个BarSeries创建简单的2D图表

本教程介绍了如何使用两个BarSeries创建简单的2D图表。 BarSeries将数据值表示为矩形条,并且可以用于以非常清晰的方式可视化数据之间的差异和方差。 在本教程中,BarSeries用于表示两年期间...

roffey
4分钟前
0
0
Mybatis trim 标签的 2 个妙用!

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼...

osc_x03qsedc
4分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部