java.io.Serializable 接口没有任何方法和字段,仅仅表示实现它的类的对象可以被序列化。实现了这个接口的所有类及其子类都可以对象序列化。
序列化前,虚拟机要清楚每个对象的结构,所以序列化会比较慢,如果关心性能或者需要读取大量的特定的类对象,可以使用 java.io.Externalizable接口(实现此接口的类的序列化完全由该类程序自身控制)
对象序列化一般出现在如下的环境下:
把对象的字节序列保存在物理存储介质中(如硬盘文件);
把对象的字节序列经网络传输给请求者;
序列过程的特殊处理:
private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
当ObjectOutputStream对一个对象开始序列化/反序列化时,如果该对象类具有了方法writeObject()/readObject(),就执行该方法,否则执行默认方法defaultWriteObject()/defaultReadObject().
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
在做序列化前,用另一个可序列化对象替代该序列化对象,然后进行序列化(调用defaultWriteObject()或者
writeObject())方法完成序列化操作。
反序列化:
当ObjectOutputStream反序列化时,会先在虚拟接中加载对应类,如果closspath中不存在对应类,则抛出异常:ClassNotFoundException;
不序列化的状态:
对对象的静态(与类相关,与对象无关,而序列化针对的是对象)的或瞬时的(transient)成员,不会进行序列化。
serialVersionUID 版本号:
序列化serialVersionUID 的版本号在反序列化时,用于标志序列化的发送者和接受者是否为该对象加载了与序列化是相兼容的类,如果不兼容(serialVersionUID 不相同),会导致InvalidClassException
。如果类没有显示的声明serialVersionUID,序列化是会计算默认的值。默认值在不同编译器中的结果肯能不同,为了能更好的跨平台,最好显示的声明它。
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
实例练习:
public class SerialTest {
public static void main(String[] args){
Customers customer = new Customers();
try {
FileOutputStream file = new FileOutputStream("customer.obj");
ObjectOutputStream out = new ObjectOutputStream(file);
out.writeObject(customer);
System.out.println(file.getFD().toString());
file.close();
out.close();
FileInputStream fileIN = new FileInputStream("customer.obj");
ObjectInputStream in = new ObjectInputStream(fileIN);
try {
Customers cus = (Customers)in.readObject();
/*这里虽然可以打印出静态变量,但不是因为对它进行了序列化,而是因为静态变量自身的特性造成的*/
System.out.println(cus.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Customers implements Serializable{
private static final long serialVersionUID = 167L;
private String name = "aq";
private int old = 45;
private String address = "SuZhou JiangSu China";
private transient String alias = "aaq";
private static String alisa1 = "aaaq";
private void writeObject(ObjectOutputStream out)throws IOException{
this.old = 55;
out.defaultWriteObject();
}
private void readObject(java.io.ObjectInputStream in)throws IOException, ClassNotFoundException{
in.defaultReadObject();
this.old = this.old + 5;
}
public String toString(){
StringBuilder builder = new StringBuilder(128);
builder.append("name=").append(name)
.append("\r\nold=").append(old)
.append("\r\naddress=").append(address)
.append("\r\nalias=").append(alias)
.append("\r\nalisa1=").append(alisa1);
return builder.toString();
}
分享到:
相关推荐
序列化的核心接口是 `java.io.Serializable`,它是一个标记接口,没有定义任何方法,用于标记可以被序列化的类。 #### 二、实现序列化的方法 为了使一个类支持序列化,需要让该类实现 `Serializable` 接口。实现这...
在Java中,对象序列化是通过实现`java.io.Serializable`接口来实现的。 **Serializable接口**: `Serializable`接口是一个标记接口,它没有定义任何方法。当一个类实现了这个接口,就意味着该类的对象可以被序列化...
要实现对象序列化,Java类必须实现`Serializable`接口或`Externalizable`接口。`Serializable`接口是一个空接口,当一个类实现它时,表明该类的所有实例都可以被序列化。而`Externalizable`接口提供了更多的控制权,...
NotSerializableException 是 Java 中的一个异常,它发生在尝试序列化一个不implement Serializable 接口的对象时。今天,我们将讨论 Java 中序列化 NotSerializableException 问题的解决办法。 问题描述 --------...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...
2. **接口**: 实现序列化的类需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但是通过实现这个接口,表明类的对象是可以被序列化的。 3. **过程**: - 序列化:使用`java.io....
通过实现`java.io.Serializable`接口,一个类的实例就能被序列化。 2. **默认序列化过程** 默认情况下,序列化会保存对象的所有实例变量,但不包括静态变量。这是因为静态变量属于类,而非特定的对象实例。序列化...
【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...
为了使一个Java对象能够被序列化,该对象所属的类必须实现`java.io.Serializable`接口。大部分JDK内置类如String和Date都已经实现了这个接口。另外,还有`java.io.Externalizable`接口,它继承自`Serializable`,但...
在Java中,实现对象序列化主要依靠实现`java.io.Serializable`接口。本文将深入探讨Java对象序列化的原理、用途和注意事项。 **一、序列化原理** 1. **实现Serializable接口**: 对象要能够被序列化,它所在的类...
Java序列化是将对象转换为字节流的过程,目的是为了保存对象的状态以便稍后恢复或传输到其他地方。通过实现`Serializable`接口,一个Java对象就可以被序列化。这个接口是一个标记接口,没有定义任何方法,仅表示对象...
Java的序列化机制则是语言级别的支持,通过`java.io.Serializable`接口标记类为可序列化。Java的序列化不仅用于持久化对象到文件,还用于RMI(远程方法调用)和网络通信,使得对象可以在不同的Java虚拟机之间传递。...
Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...
3. **实现**:在Java中,一个类如果想要实现序列化,需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有方法定义,只是表明该类的对象可以被序列化。 4. **序列化API**:主要包括`...
1. **魔数**:标识文件为Java序列化文件,固定为`ACED`。 2. **序列化协议版本号**:目前常用的版本号为`0005`。 3. **对象类型标志**:一个字节用于表示对象类型。例如`0x73`表示普通Java对象。 4. **类或引用标志*...
### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...
- `java.io.Serializable` 是Java序列化的基础,任何类如果想要实现序列化,就必须实现这个接口。这个接口是一个标记接口,没有定义任何方法,只是表明该类的对象可以被序列化。 3. **序列化流程** - 使用 `java....
为了使一个Java对象能够被序列化,该类必须实现`java.io.Serializable`接口。虽然这个接口没有任何方法,但它的存在告诉JVM这个类的实例可以被转换为字节流。如果一个类没有实现这个接口,尝试序列化其对象时会抛出...
在标签中提到了"源码"和"工具",这可能意味着博客作者还深入分析了Java序列化机制的源代码,并介绍了一些辅助工具,例如`jserialcom`或`serialver`命令,用于查看类的serialVersionUID。 文件列表中的"ser"可能是...