java.io.Serializable接口内部没有实现任何东西,这个接口是一个制造者(marker)接口。也就是说,对于要实现它的类来说,该接口不需要实现任何方法。它主要用来通知Java虚拟机(JVM),需要将一个对象序列化。
对于这个,有几点我们需要明确:
1.并非所有类都可以序列化,在cmd下,我们输入serialver java.net.socket,可以得到socket是否可序列化的信息,实际上socket是不可序列化的。
2.java有很多基础类已经实现了serializable接口,比如string,vector等。但是比如hashtable就没有实现serializable接口。 将对象读出或者写入流的主要类有两个: ObjectOutputStream与ObjectInputStream 。ObjectOutputStream 提供用来将对象写入输出流的writeObject方法, ObjectInputStream提供从输入流中读出对象的readObject方法。使用这些方法的对象必须已经被序列化的。也就是说,必须已经实现 Serializable接口。如果你想writeobject一个hashtable对象,那么,会得到一个异常。
下面举个例子:
import java.io.*;
public class testser implements Serializable {
public int ii;
testser() {
}
testser(int param) {
ii = param;
}
}
//上面这个类实现了Serializable ,内部维护一个属性ii。
//下面这个类来调用,将testser 类的对象进行读写操作,并存入文件中。
import java.io.*;
public class Ser {
private static String datafile = "ser.data";
public static void main(String[] argv) {
System.out.println("Java Serialization Demo.");
testser data;
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
datafile));
data = (testser) in.readObject();
in.close();
} catch (Exception e) {
data = new testser();
}
System.out.println("Original data: ii = " + data.ii);
data.ii++;
try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(datafile));
out.writeObject(data);
out.flush();
out.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
若testser 类未实现Serializable 接口,则在这句代码抛出异常 out.writeObject(data);
虽然这个序列化接口没有任何方法和域,但会为每个类生成一个序列号,生成依据是类名、类实现的接口名、public和protected方法,所以只要你一不小心改了一个已经publish的API,并且没有自己定义一个long类型的叫做serialVersionUID的field,哪怕只是添加一个getXX,就会让你读原来的序列化到文件中的东西读不出来。
比如说在testser 类中加入
public int getIi() {
return ii;
}
public void setIi(int ii) {
this.ii = ii;
}
则刚刚写入文件的对象就无法读取处理。
到底为什么要序列化呢?“对象序列化”(Object Serialization)。它面向那些实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。换句话说,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。不必关心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节。
http://developer.51cto.com/art/201202/317181.htm
相关推荐
java 序列化 对象 Serializable 写着玩的Demo 简单 实用
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...
**一、Java序列化** 1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换为可以存储或传输的数据格式的过程。在Java中,通常是将对象转换为字节数组,以便写入磁盘或通过网络发送。 2. **为什么需要...
### Java.io.Serializable 序列化问题详解 #### 一、序列化的概念与作用 在 Java 编程语言中,序列化是一种将对象的状态(即成员变量的值)转换为可以存储或传输的形式的过程。通常,这种形式是字节流,但也可以是...
在Java编程语言中,序列化(Serialization)是一种重要的机制,...`MySerializable.java`和`Product.java`这两个类的示例代码可能就是实际应用中的具体实现,通过学习和实践这些示例,可以加深对Java序列化机制的理解。
2. **接口**: 实现序列化的类需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有定义任何方法,但是通过实现这个接口,表明类的对象是可以被序列化的。 3. **过程**: - 序列化:使用`java.io....
- `java.io.Serializable` 是Java序列化的基础,任何类如果想要实现序列化,就必须实现这个接口。这个接口是一个标记接口,没有定义任何方法,只是表明该类的对象可以被序列化。 3. **序列化流程** - 使用 `java....
在 Java 中,序列化和反序列化是通过实现 Serializable 接口来实现的。Serializable 接口是一个标记接口,不包含任何方法,但它告诉 Java虚拟机(JVM)该类可以被序列化。 在上面的代码中,我们可以看到 ...
### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...
1. **Java序列化机制**:Java对象序列化是通过实现`Serializable`接口来标记一个类可被序列化。`ObjectOutputStream`用于将对象写入流,`ObjectInputStream`用于从流中读取并反序列化对象。 2. **易受攻击的库**:...
在Java中,`java.io.Serializable`接口用于标记那些可以被序列化的类。下面将详细介绍Java文件序列化读写的相关知识点。 1. **序列化的目的**: - **持久化对象**:将对象状态保存到文件或数据库中,即使程序关闭...
Java序列化(Serializable)是Java平台提供的一种持久化机制,允许将对象的状态转换为字节流,以便存储到磁盘、数据库中,或者在网络上传输。这一过程被称为对象的序列化。反之,将字节流恢复为原来的对象状态称为反...
例如,Java中的`Serializable`接口和`ObjectOutputStream`与`ObjectInputStream`类,提供了标准的序列化和反序列化方法。Python中则有`pickle`模块用于对象的序列化和反序列化,而C#中则有`BinaryFormatter`和`...
而在Java中,我们可以通过实现`Serializable`接口来使类支持序列化,或者使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行对象的序列化和反序列化。 接下来,我们讨论反序列化。反序列化是序列...
Java序列化面试题(10题) 在 Java 中,序列化是一种用于处理对象流的机制,它可以将对象的内容进行流化,使其可以被读写和传输。下面是 10 个与 Java 序列化相关的面试题目: 1. 什么是 Java 序列化,如何实现 ...
Java序列化是Java平台提供的一种持久化机制,它允许将对象的状态转换为字节流,以便存储到磁盘、数据库中或通过网络进行传输。序列化对于数据存储、跨网络对象传输以及远程方法调用(RMI)等场景非常有用。 1. **...
- 为了让一个类支持序列化,只需让该类实现`java.io.Serializable`接口。这个接口没有定义任何方法,只是一个标记接口,表明类的对象可以被序列化。 4. **序列化ID** - `serialVersionUID`是一个长整型字段,用于...