序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。对象序列化可以实现分布式对象,利用序列化可以实现深复制(clone)。
实现java.io.Serializable 接口以启用其序列化功能,序列化接口没有方法或字段,仅用于标识可序列化的语义。
为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。private static final long serialVersionUID = 6111235636157041674L;
如果你的对象序列化后存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),当你反序列化时,就会出现Exception的,这样就会造成不兼容性的问题。
但当serialVersionUID相同时,它就会将不一样的field以type的缺省值赋值(如int型的是0,String型的是null等),这个可以避开不兼容性的问题。所以最好给serialVersionUID赋值
transient是用于声明序列化的时候不被存储的,这样反序列话是出不来的。如 private transient String password;
如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。
package common;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializableObj implements Serializable {
private static final long serialVersionUID = 6106500970475457768L;
private String name;
public SerializableObj() {
this.name = "张三";
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
/**
* ByteArrayOutputStream也可以换替换为FileOutputStream
*
* 节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。 处理流:使用节点流作为输入或输出。是使用一个已经存在的输入流或输出流连接创建的。
* 一般情况下是:先打开的后关闭,后打开的先关闭
*
* 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b
*
* 例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
*
* 当然完全可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法
*
* 如果将节点流关闭以后再关闭处理流,会抛出IO异常
*
*
* @author zw
* @date 2013-4-11
* @param args
* @return void
*/
public static void main(String[] args) {
SerializableObj serializableObj = new SerializableObj();
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
serializableObj.setName("李四");
oos.writeObject(serializableObj);
byte[] buf = baos.toByteArray();// 获取内存缓冲中的数据
bais = new ByteArrayInputStream(buf);
ois = new ObjectInputStream(bais);
serializableObj = (SerializableObj) ois.readObject();
System.out.println(serializableObj.getName());
baos.close();
oos.close();
bais.close();
ois.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}