继续“对象的序列化和反序列化”:
如果希望进一步控制对象的序列化和反序列化的方式,步骤如下:
- 我们可以在以上的User类中提供一个readObject()和writeObject()方法。
- 当ObjectOutputStream(对象输出流)对一个对象进行序列化时,如果该对象具有writeObject()方法,那么就执行这个方法,否则就按默认的方式序列化。
- 在writeObject()方法中,可以调用ObjectOutputStream的defaultWriteObject()方法,使得对象输出流执行默认序列化操作。
- 当ObjectInputStream(对象输入流)对一个对象进行反序列化的时候,如果该对象具有readObject()方法,那么就执行这个方法,否则就按默认的方式反序列化。
- 在readObject()方法中,可以调用ObjectInputStream的defaultReadObject()方法,使得对象的输入流执行默认的反序列化操作。
例如修改后的Java类:为User类提供了writeObject()和readObject()方法,使得被transient关键字修饰的password属性能够进行特殊的序列化。在writeObject()方法中先对name属性进行了默认的序列化,接着把password属性进行加密后再序列化,具体办法为获得password属性的字节数组,把数组中的每个字节的二进制位取反,再把取反后的字节数组写到对象输出流中。
package safe;
import java.io.*;
public class User implements Serializable {
private String name;
private transient String password;
public User(String name, String password) {
this.name=name;
this.password=password;
}
public String toString() {
return name + " " + password;
}
/** 加密数组,将buff数组中的每个字节的每一位取反
* 例如13的二进制为00001101,取反后为11110010
*/
private byte[] change(byte[] buff){
for(int i=0;i<buff.length;i++){
int b=0;
for(int j=0;j<8;j++){
int bit=(buff[i]>>j & 1)==0 ? 1:0;
b+=(1<<j)*bit;
}
buff[i]=(byte)b;
}
return buff;
}
private void writeObject(ObjectOutputStream stream)throws IOException {
stream.defaultWriteObject(); //先按默认方式序列化
stream.writeObject(change(password.getBytes()));
}
private void readObject(ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject(); //先按默认方式反序列化
byte[] buff=(byte[])stream.readObject();
password = new String(change(buff));
}
public static void main(String[] args) throws Exception{
User user = new User("Tom", "123456");
System.out.println("Before Serialization:" + user);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
//把User对象序列化到一个字节缓存中
ObjectOutputStream o =new ObjectOutputStream(buf);
o.writeObject(user);
//从字节缓存中反序列化User对象
ObjectInputStream in =new ObjectInputStream(
new ByteArrayInputStream(buf.toByteArray()));
user= (User)in.readObject();
System.out.println("After Serialization:" + user);
}
}
在User对象序列化的数据中,保存了password属性的加密数据,在反序列化过程中,会把password的加密数据再恢复到password属性。以上程序的打印结果为:
Before Serialization:weidong tomcat
After Serialization:weidong tomcat
分享到:
相关推荐
写类的时候使用System.Serializable属性以便使类的成员可以序列化 方法:是一种用于实现可以由对象或类执行的计算或操作的成员。类的方法主要是和类相关联的动作,它是类的外部界面,对于那些私有的字段来说,外部...
开发环境搭建、语法基础、面向对象编程、类型转换、字符串处理与数学运算、控制台应用程序、变体的应用、集合与泛型、调试与单元测试、Lambda表达式、LINQ查询语句、Windows窗体应用程序、WPF基础知识、多线程与异步...
开发环境搭建、语法基础、面向对象编程、类型转换、字符串处理与数学运算、控制台应用程序、变体的应用、集合与泛型、调试与单元测试、Lambda表达式、LINQ查询语句、Windows窗体应用程序、WPF基础知识、多线程与异步...
二、解题分析: # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Codec: def __init__(self): self....
031217_【第12章:JAVA IO】_对象序列化笔记.pdf 031218_〖第12章:JAVA IO〗_实例操作—单人信息管理程序笔记.pdf 031219_〖第12章:JAVA IO〗_实例操作:投票程序笔记.pdf 031301_【第13章:Java类集】_认识类集、...
模型:卷积神经网络和序列的融合,使用LSTM / GRU进行序列建模—————————————————————————————————— ———————————— 笔记本: Sequence2Sequence_LSTM.ipynb: ...
委托是一个数据结构,该数据结构引用一个静态方法,或引用一个对象实例和该对象的实例方法。在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种...
目的:熟悉时间序列数据的处理方法和时间序列的使用,并用可视化展示出来。 我们来看一下西雅图费利蒙桥的自行车数量统计。该数据集来源自一个自动自行车的计数器,在 2012 年末安装上线,它们能够感应到桥上东西双 ...
答:主要的软件开发方法有:结构化开发方法、Jackson(JSP、JSD)方法、原型化开发方 法、维也纳开发方法(VDM)和面向对象的开发方法。 6. 软件生命期各阶段的任务是什么? 答:软件生命期瀑布模型分为六个阶段: ...
泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载...
deserialize(s),将字符串反序列化回树。 () 上面的链接有: LeetCode——二叉搜索树迭代器(Java) LeetCode——二叉树右侧视图(Java) LeetCode——平衡二叉树(Java) LeetCode——反转二叉树(Java) 水库采样 ...
简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS...
所有序列化都是使用协议缓冲区完成的——新的 3.0 版本。 仅供参考:0.10 中的 TensorFlow 不使用 OpenCL 进行硬件加速(它在路线图上,这会很棒。) 我认为如果你安装了 Xcode,你就可以构建和运行这个项目。 您...
释放用于音乐理论、分析和作曲的数据工具用于音高集和节奏序列分类和操作、广义音乐和声音空间中网络的生成、音色识别的深度学习算法以及任意数据的声化的 Python 库 目录 快速开始 pip安装musicntwrk 或者 pip ...
数据结构和序列(元组、列表、字典、集合) 3 职能 四 作业 #1 NumPy 基础 —— 五 使用 Pandas 进行主要数据分析Pandas 数据类型:Series、DataFrame、Index 6 作业#2 —— 7 数据可视化Seaborn、Plotly、...
行为就是一切——用感觉运动偶发事件来表示概念 [] [] [] IMPALA:具有重要性加权 Actor-Learner 架构的可扩展分布式深度强化学习 [] [] [] DeepType:通过神经类型系统进化的多语言实体链接 [] [] [] DensePose:...
22【芯航线FPGA学习平台众筹进度帖】【有奖活动】芯航线FPGA学习平台有奖活动第一季——看教程,秀笔记,赢好礼 http://bbs.elecfans.com/jishu_520463_1_1.html 23【连载视频教程(十三)】嵌入式块RAM应用之双口RAM...