一.Java序列化方式
1.默认方式序列化
1)实现serializable接口
2)实现序列化的代价:
降低该类的灵活性
增加了错误和不安全的可能
增加测试负担
如果不可序列化类的子类要实现序列化,父类必须要提供一个无参的构造函数。
3)UID的作用,其实该字段除了可以在序列化过程中加速判断错误,其他时间毫无意义,比如即使UID一样,但是你增加一个字段还是不会报错,比如你减少一个字段,照样报错,当然在自定义序列化方式的时候,你需要兼容默认序列化方式。
2.自定义序列化方式
比如序列化一个List结构的类,就应该考虑是否使用自定义序列化方式
通过transient修饰,就可以从默认序列化方式中被忽略。
下面我们以ArrayList的自定义序列化方式来说明问题:
private transient E[] elementData;//将elementDate从默认序列化方式中忽略,优化性能,节省序列化空间
/**
* Save the state of the <tt>ArrayList</tt> instance to a stream (that
* is, serialize it).
*
* @serialData The length of the array backing the <tt>ArrayList</tt>
* instance is emitted (int), followed by all of its elements
* (each an <tt>Object</tt>) in the proper order.
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
int expectedModCount = modCount;
// Write out element count, and any hidden stuff
s.defaultWriteObject();
// Write out array length
s.writeInt(elementData.length);
// Write out all elements in the proper order.
for (int i=0; i<size; i++)
s.writeObject(elementData[i]);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
/**
* Reconstitute the <tt>ArrayList</tt> instance from a stream (that is,
* deserialize it).
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Read in size, and any hidden stuff
s.defaultReadObject();
// Read in array length and allocate array
int arrayLength = s.readInt();
Object[] a = elementData = (E[])new Object[arrayLength];
// Read in all elements in the proper order.
for (int i=0; i<size; i++)
a[i] = s.readObject();
}
3.readobject方法安全性问题
当你在反序列化回来的时候,可以传2个引用过来,虽然引用时final类型的,但是某些final类型引用的值是可以改变的,比如Date类型,所以会造成不安全的事件发生。
解决方法:
1.在readobject的时候,将引用对象克隆
start = new Date(start.getTime());
这样外部引用就失效了。
2.通过readResolve方法来解决
readResolve方法的作用是,抛弃反序列化回来的对象引用,将该对象垃圾收集,然后使用该方法返回的新对象引用,看起来比较酷。并且可以很好的解决单例模式无法反序列化的问题。
分享到:
相关推荐
1. **Java序列化机制**:Java对象序列化是通过实现`Serializable`接口来标记一个类可被序列化。`ObjectOutputStream`用于将对象写入流,`ObjectInputStream`用于从流中读取并反序列化对象。 2. **易受攻击的库**:...
3. **防御策略**:提供指南或自动化脚本,帮助管理员禁用不必要的序列化,或者部署中间件来过滤不安全的输入。 4. **模拟攻击**:通过模拟真实攻击场景,帮助安全团队评估和增强安全响应能力。 了解Java反序列化...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,通常用于持久化数据或在网络间传输对象。然而,这个过程也可能带来安全风险,因为恶意用户可以构造特殊的序列化数据来执行任意代码,这就是所谓的Java反序...
在Java编程中,对象的序列化与反序列化是实现数据持久化和网络传输的关键技术。序列化是将对象的状态转换为字节流的过程,以便可以将其保存到文件、数据库或通过网络传输。反序列化则是将这些字节流转换回对象的过程...
- **Java-Deserialization-Cheat-Sheet**:提供了一系列关于Java反序列化的实用指南和技巧汇总。 #### 四、总结 通过深入分析Fastjson和Weblogic的经典案例,我们可以看到,虽然反序列化技术在实际应用中带来了...
Java序列化和反序列化是Java开发中常见且重要的概念,它们主要用于对象的状态持久化以及在不同系统间传递数据。本库专注于将Java对象转换为JSON格式,这在Web服务、API开发、数据存储和传输等方面都有广泛的应用。...
Java反序列化是一个重要的编程概念,特别是在企业级应用开发中,如JBoss、WebLogic和WebSphere这样的服务器环境中。这个压缩包文件“Java反序列化终极检测工具_Jboss & Weblogic & Websphere.zip”似乎包含了一些...
Java反序列化是一个重要的安全议题,特别是在Web应用的环境中,如WebLogic和JBoss等中间件,它们在处理用户输入时可能涉及对象的反序列化操作。反序列化漏洞是由于程序在处理反序列化的对象时没有进行充分的验证,...
Java RMI的反序列化漏洞主要源于不正确的类型检查和信任机制。当接收到未经验证的远程调用时,如果服务器没有正确地校验或限制输入数据,攻击者可以通过构造恶意序列化数据来操控远程对象的行为。这种漏洞可能允许...
首先,我们需要理解Java序列化的基本概念。Java对象序列化是将对象的状态转换为字节流,以便可以保存到磁盘、通过网络发送或在内存中传输。反序列化则是相反的过程,即从字节流恢复对象。这个过程由`java.io....
5. **使用测试工具**:在使用这些工具时,首先需要了解目标Shiro应用的环境和配置,然后按照工具的使用指南,生成或提供可能的恶意序列化数据。测试工具会尝试利用这些数据触发反序列化过程,观察是否有异常发生或不...
Java序列化是一个重要的编程概念,它允许对象的状态被转换为字节流,便于存储或在网络上传输。在Java中,标准的序列化机制是通过实现`java.io.Serializable`接口来实现的,但这并不是唯一的方式,尤其是在追求高性能...
4. **JAXB(Java Architecture for XML Binding)**:JAXB允许Java对象和XML之间进行自动转换,简化了数据序列化和反序列化的过程。通过注解和API,可以方便地将Java类映射到XML schema,并进行序列化和反序列化操作...
Java与XML的结合使得开发者能够高效地处理XML文档,实现数据的序列化和反序列化,以及构建基于XML的网络服务。 首先,我们需要理解XML的基本概念。XML是一种自解释的、灵活的标记语言,它通过标签来描述数据的结构...
- 在 Java 中,可以利用 `java.io.Serializable` 接口实现对象的序列化与反序列化。 2. **Hessian 库**: - Hessian 是一种二进制 RPC 协议,用于在网络上传输 Java 对象。它支持对象的序列化与反序列化,并且...
1. **了解序列化和反序列化**:在Java中,序列化是将对象转换为字节流的过程,便于存储或网络传输。反序列化则是相反的过程,将字节流恢复为对象。不安全的反序列化允许攻击者构造恶意输入,以触发意外的行为。 2. ...
- **序列化和反序列化**:序列化是将对象转换为字节流的过程,以便保存到磁盘或在网络上传输;反序列化则是将字节流还原为对象。 - **Java实现浅克隆与深克隆**:浅克隆复制对象本身及含有引用的对象地址,而深克隆...
此外,还介绍了Java集合类的使用,枚举的用法和Java IO与NIO的使用和原理,Java反射机制,序列化和反序列化的原理和安全问题,以及注解的使用、JMS消息服务、JMX管理模型、泛型编程、单元测试、正则表达式、常用工具...
除此之外,本指南还涉及到了Collection与Collections的区别、IO与NIO的区别、Java中如何实现浅克隆与深克隆以及枚举类型是否可以序列化等问题。每个知识点的解释都不会过于深入,而是倾向于提供快速复习的要点,帮助...
序列化和反序列化 继承封装多态的实现原理 集合类 Java集合类总结 Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解:Queue和LinkedList Java集合详解:迭代器,快速失败机制与比较器...