前言:
简单来说序列化就是一种用来处理对象流的机制。所谓对象流也就是将对象的
内容进行流化,流的概念这里不用多说(就是I/O)。我们可以对流化后的对象进行读写
操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!
在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!
问题的引出:
如上所述,读写对象会有什么问题呢?比如:我要将对象写入一个磁盘文件而后再将
其读出来会有什么问题吗?别急,其中一个最大的问题就是对象引用!
举个例子来说:假如我有两个类,分别是A和B,B类中含有一个指向A类对象的引用,
现在我们对两个类进行实例化{ A a = new A(); B b = new B(); }。这时在内存中实际上分配
了两个空间,一个存储对象a,一个存储对象b。接下来我们想将它们写入到磁盘的一个文件
中去,就在写入文件时出现了问题!因为对象b包含对对象a的引用,所以系统会自动的将a
的数据复制一份到b中,这样的话当我们从文件中恢复对象时(也就是重新加载到内存中)时,
内存分配了三个空间,而对象a同时在内存中存在两份,想一想后果吧,如果我想修改对象a
的数据的话,那不是还要搜索它的每一份拷贝来达到对象数据的一致性,这不是我们所希望的!
以下序列化机制的解决方案:
1.保存到磁盘的所有对象都获得一个序列号(1, 2, 3等等)
2.当要保存一个对象时,先检查该对象是否被保存了
3.如果以前保存过,只需写入"与已经保存的具有序列号x的对象相同"的标记,否则,保存该对象
通过以上的步骤序列化机制解决了对象引用的问题!
序列化的实现:
将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable
只是为了标注该对象是可被序列化的。然后使用一个输出流(如:FileOutputStream)来构造一个
ObjectOutputStream(对象流)对象。接着,使用ObjectOutputStream对象的writeObject(Object obj)方法
就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
在序列化的过程中,有些数据字段我们不想将其序列化,对于此类字段我们只需要在定义
时给它加上transient关键字即可,对于transient字段序列化机制会跳过不会将其写入文件,当然
也不可被恢复。但有时我们想将某一字段序列化,但它在SDK中的定义却是不可序列化的类型,
这样的话我们也必须把他标注为transient,可是不能写入又怎么恢复呢?好在序列化机制为包含
这种特殊问题的类提供了如下的方法定义:
private void readObject(ObjectInputStream in) throws
IOException, ClassNotFoundException;
private void writeObject(ObjectOutputStream out) throws
IOException;
(注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的)
相关推荐
Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在 Java 中,序列化和反序列化是...
在Java中,如果一个类需要支持序列化,它应该实现`java.io.Serializable`接口。 在Java序列化过程中,`serialVersionUID`扮演着至关重要的角色。`serialVersionUID`是一个长期不变的标识符,用于验证序列化版本的...
- Java允许使用 `writeObject()` 和 `readObject()` 方法来自定义序列化和反序列化的行为,这两个方法需要在类中声明为`private`,并由`java.io.Serializable` 接口的实现类提供。 7. **序列化安全性** - 序列化...
这两种方案都能有效解决序列化技术在元数据保留和跨应用程序共享方面的局限,为Java持久化提供了更强大、更灵活的解决方案。 #### 结论 在Java持久化技术中,序列化与O/X mapping分别代表了基本与高级的解决方案。...
浅谈java中为什么实体类需要实现序列化 在Java中,实体类需要实现序列化是因为序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。在Java中,实现序列化的类需要实现java.io.Serializable...
Java序列化是Java平台中的一种持久化机制,它允许对象的状态被转换成字节流,以便存储、网络传输或在不同时间点恢复。这个过程被称为序列化,而反向操作称为反序列化。序列化在许多场景下都非常有用,比如在分布式...
要实现一个对象的序列化,该对象的类必须实现`Serializable`接口。这是一个标记接口,没有包含任何方法,只是表明该类的对象是可以被序列化的。 下面是一些关于序列化的重要知识点: 1. **序列化标识符...
在Java中,如果一个类需要支持序列化,那么这个类就需要实现`java.io.Serializable`接口,尽管该接口没有任何方法需要实现,但它的存在就标志着这个类的对象可以被序列化。 首先,我们来看一下`SerializableDemo`这...
2. **为什么需要序列化**:序列化有以下主要用途: - 持久化对象:将对象保存到磁盘,即使程序关闭后,也能恢复对象状态。 - 远程通信:在网络间传输对象,序列化可以使对象在不同JVM之间传递。 - 节省内存:通过...
首先,要实现序列化,一个Java类必须实现`Serializable`接口。这是一个标记接口,没有定义任何方法,只是告诉Java虚拟机(JVM)这个类的对象是可以序列化的。例如: ```java public class MyEntity implements ...
而在Java中,我们可以通过实现`Serializable`接口来使类支持序列化,或者使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行对象的序列化和反序列化。 接下来,我们讨论反序列化。反序列化是序列...
4. **序列化**:实现Serializable接口,使JavaBean支持序列化,便于持久化。 JavaBean在持久化中的作用主要是作为数据载体,通过ORM(对象关系映射)框架如Hibernate,将Java对象转换成数据库中的记录。 ### XML ...
Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...
首先,要使一个Java对象能够被序列化,该类必须实现`Serializable`接口。这个接口没有任何方法,仅仅是一个标记接口,表明该类的对象可以被序列化。当一个类实现了这个接口,Java运行时系统就能够将其实例转换为字节...
Java对象序列化与反序列化是Java编程中重要的概念,主要应用于数据持久化、网络传输以及存储等场景。本文将详细解析这两个概念及其在实际应用中的实现方式。 **一、Java对象序列化** 1. **定义**: Java对象序列化...
二、为什么需要Java序列化 1. 持久化:序列化可以将对象状态持久化到磁盘,以便下次程序运行时可以恢复。 2. 网络传输:在分布式系统中,序列化对象可以方便地在网络间进行传输。 3. 缓存:序列化有助于将对象存储在...
【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...
一个类如果想要支持序列化功能,就需要实现这个接口。 **1.11 `Externalizable`接口** 除了`Serializable`接口之外,Java还提供了更强大的`Externalizable`接口。实现该接口的类不仅可以控制对象的序列化过程,还...
Java序列化是一项核心功能,它允许程序员将对象的状态转化为字节流的形式,从而实现对象的持久化存储或者在网络之间进行传递。这对于诸如远程方法调用(RMI)、分布式计算、对象存储以及缓存管理等场景至关重要。下面...
要实现Java对象的序列化,首先需要让对象所属的类实现`java.io.Serializable`接口。这个接口是一个标记接口,不包含任何方法,它的作用是告诉Java虚拟机该类的对象是可以被序列化的。例如: ```java import java.io...