`
crazy_rabbit
  • 浏览: 33512 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

对象的序列化和反序列化——笔记二

阅读更多

继续“对象的序列化和反序列化”:

如果希望进一步控制对象的序列化和反序列化的方式,步骤如下:

  1. 我们可以在以上的User类中提供一个readObject()和writeObject()方法。
  2. 当ObjectOutputStream(对象输出流)对一个对象进行序列化时,如果该对象具有writeObject()方法,那么就执行这个方法,否则就按默认的方式序列化。
  3. 在writeObject()方法中,可以调用ObjectOutputStream的defaultWriteObject()方法,使得对象输出流执行默认序列化操作。
  4. 当ObjectInputStream(对象输入流)对一个对象进行反序列化的时候,如果该对象具有readObject()方法,那么就执行这个方法,否则就按默认的方式反序列化。
  5. 在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
 

 

0
0
分享到:
评论

相关推荐

    c#学习笔记——学习心得

    写类的时候使用System.Serializable属性以便使类的成员可以序列化 方法:是一种用于实现可以由对象或类执行的计算或操作的成员。类的方法主要是和类相关联的动作,它是类的外部界面,对于那些私有的字段来说,外部...

    C#6.0学习笔记——从第一行C#代码到第一个项目设计(第二个包)

    开发环境搭建、语法基础、面向对象编程、类型转换、字符串处理与数学运算、控制台应用程序、变体的应用、集合与泛型、调试与单元测试、Lambda表达式、LINQ查询语句、Windows窗体应用程序、WPF基础知识、多线程与异步...

    C#6.0学习笔记——从第一行C#代码到第一个项目设计(第一个包)

    开发环境搭建、语法基础、面向对象编程、类型转换、字符串处理与数学运算、控制台应用程序、变体的应用、集合与泛型、调试与单元测试、Lambda表达式、LINQ查询语句、Windows窗体应用程序、WPF基础知识、多线程与异步...

    《剑指Offer》刷题笔记——面试题37. 序列化二叉树

    二、解题分析: # 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....

    Java开发详解.zip

    031217_【第12章:JAVA IO】_对象序列化笔记.pdf 031218_〖第12章:JAVA IO〗_实例操作—单人信息管理程序笔记.pdf 031219_〖第12章:JAVA IO〗_实例操作:投票程序笔记.pdf 031301_【第13章:Java类集】_认识类集、...

    Sequence_2_Sequence_Modelling

    模型:卷积神经网络和序列的融合,使用LSTM / GRU进行序列建模—————————————————————————————————— ———————————— 笔记本: Sequence2Sequence_LSTM.ipynb: ...

    c#学习笔记.txt

    委托是一个数据结构,该数据结构引用一个静态方法,或引用一个对象实例和该对象的实例方法。在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种...

    Python数据分析实践:时间序列实例.pdf

    目的:熟悉时间序列数据的处理方法和时间序列的使用,并用可视化展示出来。 我们来看一下西雅图费利蒙桥的自行车数量统计。该数据集来源自一个自动自行车的计数器,在 2012 年末安装上线,它们能够感应到桥上东西双 ...

    软件工程-理论与实践(许家珆)习题答案

    答:主要的软件开发方法有:结构化开发方法、Jackson(JSP、JSD)方法、原型化开发方 法、维也纳开发方法(VDM)和面向对象的开发方法。 6. 软件生命期各阶段的任务是什么? 答:软件生命期瀑布模型分为六个阶段: ...

    asp.net知识库

    泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载...

    leetcode蓄水池JAVA-iq-notes:智商笔记

    deserialize(s),将字符串反序列化回树。 () 上面的链接有: LeetCode——二叉搜索树迭代器(Java) LeetCode——二叉树右侧视图(Java) LeetCode——平衡二叉树(Java) LeetCode——反转二叉树(Java) 水库采样 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS...

    谷歌师兄的leetcode刷题笔记-tensorflow-cocoa-example:在桌面Cocoa应用程序中使用tensorflow

    所有序列化都是使用协议缓冲区完成的——新的 3.0 版本。 仅供参考:0.10 中的 TensorFlow 不使用 OpenCL 进行硬件加速(它在路线图上,这会很棒。) 我认为如果你安装了 Xcode,你就可以构建和运行这个项目。 您...

    harmonyos2-musicntwrk:广义音乐空间的网络分析

    释放用于音乐理论、分析和作曲的数据工具用于音高集和节奏序列分类和操作、广义音乐和声音空间中网络的生成、音色识别的深度学习算法以及任意数据的声化的 Python 库 目录 快速开始 pip安装musicntwrk 或者 pip ...

    leetcode分类-python-for-data-analysis:用于数据分析的python

    数据结构和序列(元组、列表、字典、集合) 3 职能 四 作业 #1 NumPy 基础 —— 五 使用 Pandas 进行主要数据分析Pandas 数据类型:Series、DataFrame、Index 6 作业#2 —— 7 数据可视化Seaborn、Plotly、...

    国外程序员刷题-deeplearning-papernotes:深度学习研究论文摘要和笔记

    行为就是一切——用感觉运动偶发事件来表示概念 [] [] [] IMPALA:具有重要性加权 Actor-Learner 架构的可扩展分布式深度强化学习 [] [] [] DeepType:通过神经类型系统进化的多语言实体链接 [] [] [] DensePose:...

    小梅哥FPGA设计思想与验证方法视频教程 网盘地址.txt

    22【芯航线FPGA学习平台众筹进度帖】【有奖活动】芯航线FPGA学习平台有奖活动第一季——看教程,秀笔记,赢好礼 http://bbs.elecfans.com/jishu_520463_1_1.html 23【连载视频教程(十三)】嵌入式块RAM应用之双口RAM...

Global site tag (gtag.js) - Google Analytics