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(Objectobj)方法写对象
如:
ObjectOutputStream out = newObjectOutputStream(new FileOutputStream(filePath));//filePath:文件路径
out.writeObject(obj);//obj:要写入文件的对象
对象反序列化步骤:
1.创建一个对象输入流
2.通过对象输入流的readObject(j)方法读取对象.(读取对象时是按照对列方式进行的,既先进先出)
如:
ObjectInputStream in = new ObjectInputStream (newFileInputStream(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平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...
【Protocol Buffer序列化对比Java序列化】 Protocol Buffer(简称PB)是Google开发的一种高效的数据序列化协议,而Java序列化是Java平台内置的一种序列化机制。两者的主要目标都是将对象转化为字节数组,便于在网络...
.net 将dataset json序列化和反序列化成dataset JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - ...
3. **兼容性测试**:确保反序列化过程在不同版本的Java平台上都能正常工作,以及与各种序列化库(如Apache Commons Lang的SerializationUtils)的兼容性。 4. **性能评估**:测试反序列化操作的性能,包括时间和...
标题"Java反序列化工具.zip"暗示了这个压缩包包含了一些工具,这些工具可能是为了帮助开发者理解、测试或者防御Java反序列化漏洞而设计的。可能包括模拟攻击的payload生成器,或者用于检测和修复此类漏洞的分析工具...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。然而,反序列化也可能带来安全风险,尤其是当处理来自不可信源的数据时,恶意用户可能会利用这些漏洞执行任意...
Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...
Java反序列化是一种将之前序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种方式。在软件开发中,特别是在服务器端应用中,反序列化常常用于在网络传输或存储后恢复对象的状态。然而,如果这个过程...
Java反序列化漏洞的产生原理主要是在对象反序列化过程中,由于程序对输入数据控制不严,可能会产生非预期的对象,进而可能带来任意代码执行的问题。攻击者可以利用这一漏洞,通过精心构造的数据序列化后,由应用程序...
综上所述,"java反序列香草"工具可能是安全社区用来测试和诊断Java应用反序列化漏洞的一个实用工具,帮助用户发现和修复潜在的安全问题,确保系统的稳定和安全。了解并掌握这些知识点对于Java开发人员和安全专家来说...
**FST:快速Java序列化的替代方案** 在Java开发中,序列化是一个常见的需求,它允许将对象的状态转换为字节流,以便于存储或网络传输。标准的Java序列化虽然方便,但在处理大量数据时,性能往往成为瓶颈。这时,FST...
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
Java序列化面试题(10题) 在 Java 中,序列化是一种用于处理对象流的机制,它可以将对象的内容进行流化,使其可以被读写和传输。下面是 10 个与 Java 序列化相关的面试题目: 1. 什么是 Java 序列化,如何实现 ...
1. **Java反序列化漏洞**:当不信任的数据源提供的序列化对象被反序列化时,如果对象的类包含危险的方法(如`ObjectInputStream.readObject()`),攻击者可以构造特殊的序列化数据来触发这些方法,执行任意代码。...
Java反序列化是一个重要的编程概念,特别是在企业级应用开发中,如JBoss、WebLogic和WebSphere这样的服务器环境中。这个压缩包文件“Java反序列化终极检测工具_Jboss & Weblogic & Websphere.zip”似乎包含了一些...
Java反序列化漏洞是软件安全领域的一个重要话题,它涉及到Java应用程序在处理序列化和反序列化过程中的安全问题。序列化是将对象状态转换为可存储或传输的数据格式的过程,而反序列化则是将这些数据恢复为原来的对象...
Java序列化是将Java对象转换为字节流的过程,以便可以在磁盘、数据库或网络上存储或传输这些对象。这使得我们能够保存对象的状态,并在稍后的时间点恢复它,或者在网络之间传递对象。反序列化是相反的过程,即从字节...
### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的...以上内容涵盖了Java序列化标准的关键知识点,深入了解这些概念有助于更好地理解和应用Java序列化技术。
Gson 是一个 Java 库,可用于将 Java 对象转换为其 JSON 表示形式。它还可用于将 JSON 字符串转换为等效的 Java 对象。Gson 可以处理任意 Java 对象,包括您没有源代码的现有对象。 有一些开源项目可以将 Java 对象...