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序列化是强大而灵活的工具,但也需要注意隐私和性能问题。通过使用`transient`关键字、自定义序列化方法或第三方库,我们可以排除对象中不希望被序列化的属性。理解这些机制对于编写安全且高效的Java应用程序至...
而“【笔记】序列化和反序列化.docx”可能包含作者对学习过程的总结和心得,对于深入理解这些概念很有帮助。“01预习资料.docx”可能提供了基本的概念介绍,是学习序列化和反序列化的好起点。 总的来说,序列化和反...
如果你确实需要序列化静态变量,你需要使用`transient`关键字标记那些不需要序列化的静态变量,或者自定义序列化和反序列化逻辑。 总结起来,Java的序列化是一个强大的工具,允许对象在网络和磁盘之间自由移动,...
日常笔记-JAVA序列化
java序列化资料 主要是记录的一些笔记的东西。给自己保存的
6. **IO流**:Java的输入输出流系统用于读写数据,包括字节流和字符流,以及对象序列化和反序列化。 7. **多线程**:Java提供了丰富的API来支持多线程编程,如Thread类和Runnable接口,同步机制(synchronized...
"Memo"这个文件可能是包含有关序列化技术的笔记、代码示例或者教程,由于无法直接查看具体内容,我将基于常规的序列化知识进行详细解释。 序列化的主要应用场景有: 1. **持久化存储**:当需要将对象存储到硬盘上...
- **序列化接口**:用于将对象转换为字节流以便持久化。 - **I/O流基础**:如InputStream、OutputStream等。 - **流的分类**:字节流和字符流。 - **输入输出**:读取和写入文件。 #### 16. 网络编程 Java支持多种...
Java序列化是将对象转换为字节流的过程,便于存储或网络传输。笔记中会涵盖Serializable接口,ObjectInputStream和ObjectOutputStream的使用,以及反序列化的注意事项。 4. **集合框架**: 集合框架是Java中处理...
4. **IO流**:介绍输入/输出流的概念,包括文件操作、字节流、字符流、对象序列化等。这部分内容涉及数据的读写和传输。 5. **网络编程**:讲解Socket编程,如何创建客户端和服务器进行网络通信,以及HTTP、HTTPS...
JavaScript中的Java序列化程序JavaScript中本机Java序列化的实现。 还包括两个反序列化有效负载生成器(在上可以看到:JRMPClient和CommonBeanutils1的JNDI变体)以及一个CVE-2018-2800的PoC: 直到2018年4月CPU(6u...
4. **文件I/O流编程**:读写文件、数据序列化等。 5. **网络编程**:TCP/IP协议的应用,如客户端/服务器模型。 6. **多线程编程**:利用多线程提高程序性能。 #### Java EE基础知识 1. **Java面向对象编程**:与...
- **对象序列化**:学习如何将对象持久化到磁盘,以及反序列化恢复对象。 5. **反射**: - **Class类**:通过Class对象获取类的信息,如构造器、方法和字段。 - **动态调用方法**:在运行时动态地创建对象并调用...
文件I/O、网络I/O和对象序列化都是基于Java的流模型。 此外,线程是Java并发编程的基础,通过实现Runnable接口或继承Thread类可以创建并运行线程。线程管理包括同步和互斥,以避免多线程环境下的数据不一致性。 ...
可能需要JSON或XML序列化技术来保存额外的元数据,如撤销历史。 - 文件对话框:`JFileChooser`类提供了一种让用户选择文件保存或打开的方式。 7. **事件处理**: - Java Swing使用事件监听器模型。为GUI组件添加`...
同时,还会涵盖对象序列化和反序列化的概念。 【多线程】 Java提供了内置的多线程支持,笔记将讲解Thread类和Runnable接口的使用,以及线程同步机制(如synchronized关键字、wait()、notify()方法和Lock接口)。...
这对于插件化开发、序列化和动态代理等高级应用至关重要。 8. **泛型**: 泛型引入了类型安全,可以在编译时检查容器中的元素类型,避免了类型转换的麻烦。了解如何声明和使用泛型类、接口及方法,可以写出更安全、...
文档还介绍了序列化和反序列化机制,用于对象的深复制和浅复制。 ### Java网络编程 网络编程章节向读者介绍了计算机网络的基础知识,包括HTTP、TCP、UDP和Socket编程。文档强调了网络编程在Java中的实现方式和应用...
5. **IO流**:讲解输入/输出流的分类和使用,包括字符流和字节流,以及缓冲流、对象序列化等高级话题。 6. **多线程**:介绍线程的基本概念,线程的创建方式,同步机制(synchronized关键字、Lock接口),以及并发...