这是最简单的序列化方式。下面的例子将类的内容写到文件中,然后再反序列化声称新的对象。
public class MyClass implements Serializable
{
private String name;
private int value;
public MyClass(String name,int value)
{
this.name=name;
this.value=value;
}
public static void main(String[] args) throws ClassNotFoundException,IOException
{
MyClass c=new MyClass("freebird",8);
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("myclass.out"));
out.writeObject(c);
ObjectInputStream in=new ObjectInputStream(new FileInputStream("myclass.out"));
MyClass c2=(MyClass)in.readObject();
}
}
Serializable接口实际上只是一个标记接口,Java虚拟机利用Class对象帮助实现对象的序列化和反序列化功能。
上面的例子我们使用了文件流,如果使用网络流对象,我们可以轻松的将对象在网络上传递。
如果MyClass对象内部包含了复杂的树结构的成员,这种机制也可以工作的很好。
作为Serializable自动序列化的补充,我们可以将成员变量使用transient关键字修饰。这些变量将不会被序列化和反序列化。
Serializable接口的缺陷
1)序列化格式将成为类的公有接口的一部分,如果类的设计发生改变,则通常序列化的格式也会发生改变,这样就等于该动了类的接口。因此有可能造成类的新旧版本的不兼容。
2)Serializable接口的发序列化机制绕过了默认构造函数。通常我们使用构造函数是为了在对象创建时检查是否符合某些约束条件。Serializable接口的自动反序列化机制不会作到这点。
3)性能不高
上面实现Serializable接口的方式会将所有的成员都序列化,但有时候并不需要将所有成员都序列化成字节流。我们可以让自己的类实现Externalizable接口。Externalizable接口扩展了Serializable接口,并且声明了下面两个抽象方法:
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;

