一天一个Java基础——序列化
1.概念
Java的“对象序列化”能将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象的时候,能把这些byte数据恢复出来,并据此重新构建那个对象。
对象序列化能实现“轻量级persistence(lightweight persistence)”。所谓persistence,是指对象的生命周期不是由程序是否运行决定的,在程序的两次调用之间对象仍然还活着。通过“将做过序列化处理的对象写入磁盘,等到程序再次运行的时候再把它读出来”,可以达到persistence的效果。
之所以要在语言里加入对象序列化,是因为要用它来实现两个重要的功能:
1.Java的远程方法调用能像调用自己机器上的对象那样去调用其它机器上的对象。
2.对JavaBean来说,Bean的状态信息通常是在设计时配置的,这些状态信息必须保存起来,供程序启动的时候用,对象序列化就负责这个工作。
对象序列化不仅能保存对象的副本,而且还会跟着对象中的reference把它所引用的对象也保存起来,然后再继续跟踪那些对象的reference。
2.实现序列化
(1)序列化一个对象只要让它实现Serializable接口就行了(这是一个“标记接口”,tagging interface,没有任何方法)。
(2)要想序列化对象,必须先创建一个OutputStream,然后把它嵌进ObjectOutputStream。这是就能用writeObject()方法把对象写入OutputStream。
(3)读的时候需要把InputStream嵌到ObjectInputStream中,然后再调用readObject()方法。
3.样例
1 package Entity; 2 3 import java.io.Serializable; 4 5 public class Employee implements Serializable{ 6 7 /* 8 * serialVersionUID作用: 9 * 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 10 * 如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名), 11 * 当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。 12 * 但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。 13 */ 14 private static final long serialVersionUID = -5167690587890199758L; 15 16 public String name; 17 public String address; 18 public transient int SSN; 19 public int number; 20 public Department department; 21 22 public String toString() { 23 return "Employee [name=" + name + ", address=" + address + ", number=" + number + "]"; 24 } 25 26 }
Employee.java
1 package Entity; 2 3 import java.io.Serializable; 4 5 public class Department implements Serializable{ 6 private static final long serialVersionUID = -6913084898834515327L; 7 8 public int id; 9 public String name; 10 11 public String toString() { 12 return "Department [id=" + id + ", name=" + name + "]"; 13 } 14 15 }
Department.java
1 package Test; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.ObjectInputStream; 8 import java.io.ObjectOutputStream; 9 10 import Entity.Department; 11 import Entity.Employee; 12 13 public class test1 { 14 15 /** 16 * 序列化对象 17 */ 18 @org.junit.Test 19 public void SerializeDemo() { 20 Employee e = new Employee(); 21 e.name = "Reyan Ali"; 22 e.address = "Phokka Kuan, Ambehta Peer"; 23 e.SSN = 11122333; 24 e.number = 101; 25 Department d = new Department(); 26 d.id = 1; 27 d.name = "Java研发"; 28 e.department = d; 29 try { 30 System.out.println(e); 31 FileOutputStream fileOut = new FileOutputStream(new File("/Users/zhengbinMac/employee.txt")); 32 ObjectOutputStream out = new ObjectOutputStream(fileOut); 33 System.out.println(e); 34 out.writeObject(e); 35 out.close(); 36 fileOut.close(); 37 System.out.printf("Serialized data is saved in /Users/zhengbinMac/employee.txt"); 38 } catch (IOException i) { 39 i.printStackTrace(); 40 } 41 } 42 43 /** 44 * 反序列化对象 45 */ 46 @org.junit.Test 47 public void DeserializeDemo() { 48 Employee e = null; 49 try { 50 FileInputStream fileIn = new FileInputStream("/Users/zhengbinMac/employee.txt"); 51 ObjectInputStream in = new ObjectInputStream(fileIn); 52 e = (Employee) in.readObject(); 53 in.close(); 54 fileIn.close(); 55 } catch (IOException i) { 56 i.printStackTrace(); 57 return; 58 } catch (ClassNotFoundException c) { 59 System.out.println("Employee class not found"); 60 c.printStackTrace(); 61 return; 62 } 63 System.out.println("Deserialized Employee..."); 64 System.out.println("Name: " + e.name); 65 System.out.println("Address: " + e.address); 66 System.out.println("SSN: " + e.SSN); 67 System.out.println("Number: " + e.number); 68 System.out.println("Department: " + e.department); 69 } 70 }
相关博文:
http://www.cnblogs.com/lanxuezaipiao/p/3369962.html
转载于:https://www.cnblogs.com/zhengbin/p/5351945.html
一天一个Java基础——序列化相关推荐
- Java基础—序列化底层原理
原文地址:https://blog.csdn.net/xlgen157387/article/details/79840134 目录 一.基本概念 二.Java如何实现序列化和反序列化 三.相关注意事 ...
- 昨晚看《天才知道》3进2的一个java基础题目有感:java是一种跨平台语言,它组成的2个部分是什么
昨晚无意中看天才知道发现了这么个题目大概是这样: java是一种跨平台语言,它组成的2个部分是什么? 思考了一下,又看一次基础: java语言是一种基于"面向对象"思想的程序设计语 ...
- Java基础-序列化与反序列化
序列化和反序列化在面试中也经常考查,下面就总结一下 Java 中的序列化和反序列化. 什么是序列化和反序列化? 序列化是将 Java 对象转换成与平台无关的二进制流,而反序列化则是将二进制流恢复成原来 ...
- Java基础—序列化关键字transient
原文作者:老鼠只爱大米 原文地址:Java中transient关键字的详细总结 一.概要介绍 本文要介绍的是Java中的transient关键字,transient是短暂的意思.对于transient ...
- Java基础-序列化和反序列化
目录 1.序列化和反序列化概述 2.序列化 3.反序列化 4.序列化多个对象 5.序列化版本号(重要) 1.序列化和反序列化概述 1.java.io.NotSerializableException ...
- 一天一个Java基础——对象和类
1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...
- 一个Java基础练习
今天在群里又有一个朋友问到了这样一个练习,我索性将代码贴到这里,下次需要的朋友可以来这里看. 用到知识点:数组.集合.IO流 问题描述:在如下图所示的一个txt文件中读取数据到内存,然后统计列除过0的 ...
- Java基础知识——IO流
简介 IO是指Input/Output,即输入和输出.以内存为中心: Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等 Output指把数据从内存输出到外部,例 ...
- java byte序列化,java对象序列化byte[] and byte[]反序列化对象--转
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...
最新文章
- 你必须了解的微服务架构设计的10个要点!
- [Java]将二叉树的左右子树交换 非递归实现
- python操作memcahed
- 前端学习(2956):项目中组件的本地注册
- Spring Data JPA 从入门到精通~@Version处理乐观锁的问题
- 幕后产品_使用Bitwarden密码管理器在幕后
- Ceph (3) - 安装Ceph集群方法3:使用 ceph-ansible 离线安装 Red Hat Ceph Storage 4.1 集群
- Real Vision CEO预测以太坊币价将在今年年初达到2万美元
- 搭建MyEclipse和Tomcat遇到的坑(JavaEE作业)
- JS 延时函数 setTimeout 或者 rxjs 写法
- java十二星座 (快来测试你是什么星座吧)
- 人人都能看懂——c大调d大调f…
- 最实用的Chrome插件--CSDN浏览器助手使用体验
- html背景图片自动铺满屏幕,【CSS背景图片页面自适应充满屏幕】
- 电动汽车动力电池SOC估算模型电池参数辨识模型【10例】
- 软件测试面包屑什么意思,面包屑的用法面包屑有什么作用
- WINCE下模拟鼠标点击,移动
- P1162 填图颜色 洛谷(BFS的简单应用)
- 【TA-霜狼_may-《百人计划》】美术1.4 场景设计精要
- 解决OpenCV读取图片慢的方案
热门文章
- 今天react开发遇到个比较恶心的问题
- fatal: unable to access ‘https://XXXXX‘: : OpenSSL SSL_read: Connection was reset, errno 10054……
- windows 设置 rocketmq环境变量_RocketMQ 开篇
- 股票撤销st申请多长时间批复?
- 为什么有人宁愿每年买一部千元机,也不愿一次买部高端机?
- 事业编,还有前途可谈么?
- 蚕豆有什么营养价值?
- 订婚和结婚有什么区别
- 你想过没有,学校从来没教过你怎么赚钱
- 为什么搞农旅项目那么多人失败?