`
cjh820425
  • 浏览: 155499 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 序列化和反序列化笔记

阅读更多

 

java 序列化与反序化

.java 序列化的用途

  1. 将数据持久化到文件中

  2. 在网络上传输字节序列

  两种功能的示意图如下 :

  <!----><!----><!----> <!----> <!---->

. 实现对象序列化的条件

  1. 只有实现了 Serializable( 默认的序列化方式 ) Externalizable( 继承 Serializable 接口 , 自定义实现来控制序列化时的行为 ) 接口的类才能被序列化 .

  2.. 利用 java.io.ObjectOutputStream 类的 writeObject(Object obj) 来实现对象序列化操作 , 并将字节序列写入到到目标输出流中 . 利用它的 readObject() 方法从源输入流中读取字节流 , 再将数据反序列化成一个对象并返回该对象 .

. 通过实现 Serializable 接口序列化 . 和反序列化

   1. 如果类 A 实现了 Serializable 接口 , 则对类 A 的非 static, transient 的实例变量进行序列化和反序列化

    此方法不能控制序列化时的行为 . 以下两种方法则行 .

   2. 如果类 A 既实现了 Serializable 接口 , 又定义了 writeObject(Object obj) 方法和 readObject() 方法 , 由调用这两个方法进行序列化和反序列化 .

   3. 如果类 A 实现了 Externalizable 接口 , 由该类必须实现 writeExternal(ObjectOutput out) 方法和 readExtername() 方法 . 在这种情况下 , 将按照这两个方法进行对象的序列化和反序列化 .

. 对象序列化和对象反序列化的步骤

   对象序列化步骤 :

   1. 创建一个对象输出流

   2. 通过对象输出流的 writeObject(Object obj) 方法写对象

    :

     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filePath));//filePath: 文件路径

     out.writeObject(obj);//obj: 要写入文件的对象

   对象反序列化步骤 :

   1. 创建一个对象输入流

   2. 通过对象输入流的 readObject(j) 方法读取对象 .( 读取对象时是按照对列方式进行的 , 既先进先出 )

   :

     ObjectInputStream  in = new ObjectInputStream (new FileInputStream(filePath));

     in.readObject();// 读取对象

. 对于实现了 Serializable 接口反序列化过程

   1. 如果内存中的对象所属的类还没有加载 , 则先加载并初始化这个类 , 如果在 classpath 中找不到这个类 , 则抛出 ClassNotFoundException

   2. 在反序列化时 , 不能调用类的任何构造方法 .

   3. 如果此类引用了其他类或者关联了其他类 , 则在序列化时 , 将同时序列化它所引用的类 .

. Serializable 接口下控制序列化行为

  1. 实现 Serializable 接口 , 并提供 private void writeObject(Object obj),private void   readObject() 方法 . 如果需要默认序列化方法或者默认反序列化方法 , 则可以在这两个方法中调用 ObjectOutputStream defaultWriteObject() 方法或者 ObjectOutputStream defaultReadObject() 方法

   2. 如何确定需要用户自定义序列化方式 , 从而控制序列化的行为 , 如下所示 :

    > 确保序列化的安全性 , 对敏感信息的隐藏者加密 . 如果序列化加密 , 则反序列化时要解密 .

    > 确保对象的成员变量符合正解的约束条件

    > 优化序列化的性能 . 主要是避免过多序列化类的关联类 .

    > 便于更好地封装类的内部数据 , 确保类的接口不会被类的内部实现所约束 .

  . 实现 Externalizable 接口

    1. 实现此接口的类必须自己控制序列化和反序列化时的行为 . 因此必须实现 public void writeExternal(ObjectOutput out) 方法和 public void readExtername() 方法 . 在对实现了 Externalizable 接口的类进行反序列化时 , 会先调用类的不带参数的构造方法 , 这是有别于默认反序列化方式的 . 所以类必须要有一个 public 访问权限的不带参数的构造方法 .

  . 可序列化类的不同版本的序列化兼容性

    对于同一个类的两个不同版本 , 即便它们的序列化版本号相同 , 也不一定能兼容 . 因为兼容性不仅取决于序列化版本号 , 还取决于类的不同版本的实现细节和序列化细节 .

 

分享到:
评论

相关推荐

    java 序列化时排除指定属性

    Java序列化是强大而灵活的工具,但也需要注意隐私和性能问题。通过使用`transient`关键字、自定义序列化方法或第三方库,我们可以排除对象中不希望被序列化的属性。理解这些机制对于编写安全且高效的Java应用程序至...

    序列化和反序列化doc文档.rar

    而“【笔记】序列化和反序列化.docx”可能包含作者对学习过程的总结和心得,对于深入理解这些概念很有帮助。“01预习资料.docx”可能提供了基本的概念介绍,是学习序列化和反序列化的好起点。 总的来说,序列化和反...

    Java中序列化学习笔记/序列和反序列化的实现

    如果你确实需要序列化静态变量,你需要使用`transient`关键字标记那些不需要序列化的静态变量,或者自定义序列化和反序列化逻辑。 总结起来,Java的序列化是一个强大的工具,允许对象在网络和磁盘之间自由移动,...

    日常笔记-JAVA序列化

    日常笔记-JAVA序列化

    java序列化资料

    java序列化资料 主要是记录的一些笔记的东西。给自己保存的

    java笔记java笔试题 java面试题

    6. **IO流**:Java的输入输出流系统用于读写数据,包括字节流和字符流,以及对象序列化和反序列化。 7. **多线程**:Java提供了丰富的API来支持多线程编程,如Thread类和Runnable接口,同步机制(synchronized...

    序列化方法,很有用资源

    "Memo"这个文件可能是包含有关序列化技术的笔记、代码示例或者教程,由于无法直接查看具体内容,我将基于常规的序列化知识进行详细解释。 序列化的主要应用场景有: 1. **持久化存储**:当需要将对象存储到硬盘上...

    java笔记 java笔记

    - **序列化接口**:用于将对象转换为字节流以便持久化。 - **I/O流基础**:如InputStream、OutputStream等。 - **流的分类**:字节流和字符流。 - **输入输出**:读取和写入文件。 #### 16. 网络编程 Java支持多种...

    张龙JAVA圣思园笔记

    Java序列化是将对象转换为字节流的过程,便于存储或网络传输。笔记中会涵盖Serializable接口,ObjectInputStream和ObjectOutputStream的使用,以及反序列化的注意事项。 4. **集合框架**: 集合框架是Java中处理...

    java学习笔记markdown

    4. **IO流**:介绍输入/输出流的概念,包括文件操作、字节流、字符流、对象序列化等。这部分内容涉及数据的读写和传输。 5. **网络编程**:讲解Socket编程,如何创建客户端和服务器进行网络通信,以及HTTP、HTTPS...

    serjs:JavaScript中的Java序列化程序

    JavaScript中的Java序列化程序JavaScript中本机Java序列化的实现。 还包括两个反序列化有效负载生成器(在上可以看到:JRMPClient和CommonBeanutils1的JNDI变体)以及一个CVE-2018-2800的PoC: 直到2018年4月CPU(6u...

    韩顺平编写的java学习笔记(全)

    4. **文件I/O流编程**:读写文件、数据序列化等。 5. **网络编程**:TCP/IP协议的应用,如客户端/服务器模型。 6. **多线程编程**:利用多线程提高程序性能。 #### Java EE基础知识 1. **Java面向对象编程**:与...

    java.rar黑马java基础笔记

    - **对象序列化**:学习如何将对象持久化到磁盘,以及反序列化恢复对象。 5. **反射**: - **Class类**:通过Class对象获取类的信息,如构造器、方法和字段。 - **动态调用方法**:在运行时动态地创建对象并调用...

    java笔记(精华集锦)

    文件I/O、网络I/O和对象序列化都是基于Java的流模型。 此外,线程是Java并发编程的基础,通过实现Runnable接口或继承Thread类可以创建并运行线程。线程管理包括同步和互斥,以避免多线程环境下的数据不一致性。 ...

    java笔记本功能实现

    可能需要JSON或XML序列化技术来保存额外的元数据,如撤销历史。 - 文件对话框:`JFileChooser`类提供了一种让用户选择文件保存或打开的方式。 7. **事件处理**: - Java Swing使用事件监听器模型。为GUI组件添加`...

    李兴华java word版全部笔记

    同时,还会涵盖对象序列化和反序列化的概念。 【多线程】 Java提供了内置的多线程支持,笔记将讲解Thread类和Runnable接口的使用,以及线程同步机制(如synchronized关键字、wait()、notify()方法和Lock接口)。...

    java笔记

    这对于插件化开发、序列化和动态代理等高级应用至关重要。 8. **泛型**: 泛型引入了类型安全,可以在编译时检查容器中的元素类型,避免了类型转换的麻烦。了解如何声明和使用泛型类、接口及方法,可以写出更安全、...

    java入门笔记.pdf

    文档还介绍了序列化和反序列化机制,用于对象的深复制和浅复制。 ### Java网络编程 网络编程章节向读者介绍了计算机网络的基础知识,包括HTTP、TCP、UDP和Socket编程。文档强调了网络编程在Java中的实现方式和应用...

    韩顺平java笔记完整版

    5. **IO流**:讲解输入/输出流的分类和使用,包括字符流和字节流,以及缓冲流、对象序列化等高级话题。 6. **多线程**:介绍线程的基本概念,线程的创建方式,同步机制(synchronized关键字、Lock接口),以及并发...

Global site tag (gtag.js) - Google Analytics