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 简单 实用
序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例...虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
java序列化(Serializable)的作用和反序列化.doc 有详细的讲解哦。 在什么地方用的到都有说明的.
java 的序列化与反序列化举例测试
Java序列化(java.io.Serializable) Hadoop序列化的特点 Hadoop的序列化格式:Writable 序列化格式特点: 紧凑:高效使用存储空间。 快速:读写数据的额外开销小 可扩展:可透明地读取老格式...
java.io.Serializable序列化问题
Java序列化(Serializable)与反序列化_.docx
java序列化(Serializable)的作用和反序列化.pdf
Java序列化(Serializable)与反序列化__1.docx
其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ObjectOutputStream ObjectInputStream Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第7页。...
主要介绍了JAVA序列化Serializable及Externalizable区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java_Serializable(序列化) 的理解和总结
这是Java 序列化(Serializable)实现的一个例子,例子是显示文件的读写的。
Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...
本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了java.io.Serializable接口才能被序列化 transient的作用是什么 怎么自定义序列...
通过实现 Serializable 接口,Java对象可以被序列化和反序列化。序列化可以将对象转换为字节流,以便于存储或传输。反序列化则可以将字节流重新转换为原始对象。需要注意的是,序列化和反序列化的类必须具有相同的 ...
虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化3、如何实现序列化将
java 序列化的问题 如何认识和解决序列化 java serializable
主要介绍了java 中序列化NotSerializableException问题解决办法的相关资料,这里对序列化问题进行描述说明,并提供解决办法,希望能帮助到大家,需要的朋友可以参考下
Java 中 Serializable的应用,序列化的作用说明