Java Serialize

一) 何为序列化(Serialize)
将Java 对象序列化为[b]二进制文件[/b]的技术称为序列化。

二)何时需要使用到序列化技术
大致三种情况吧:
a)当你想把的内存中的对象写入到硬盘的时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;

三)Hello, Serialize
话不多说,给个简单例子:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SerializeClass implements Serializable {
private static final long serialVersionUID = 1L;
private String name = "thaIm";
private transient String ignoreStr = "ignore";
public static int staticVar = 5;

public static void main(String[] args) {
try{
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj"));
out.writeObject(new SerializeClass());
out.close();

SerializeClass.staticVar = 10;

ObjectInputStream oin = new ObjectInputStream(new FileInputStream("result.obj"));
SerializeClass sc = (SerializeClass) oin.readObject();
oin.close();

System.out.println(sc.getName()+"=="+sc.getIgnoreStr()+"=="+SerializeClass.staticVar);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public void setIgnoreStr(String ignoreStr) {
this.ignoreStr = ignoreStr;
}
public String getIgnoreStr() {
return ignoreStr;
}
}


程序的输出结果: thaIm==null==10
和你想的一样么? :wink:

四)serialVersionUID
如果你第一次接触java序列化,可能会对以上代码中的serialVersionUID字段很好奇。这看似多余的东西到底有何用途呢?且听我娓娓道来~~
[b] 情境:[/b]两个客户端 A 和 B 试图通过网络传递对象数据,A 端将对象 C 序列化为二进制数据再传给 B,B 反序列化得到 C。
[b]实现条件:[/b] A B 两个客户端SerializeClass类有相同的:[b]1)类路径 2)功能代码 3)序列化ID,即serialVersionUID[/b]
而之所以要增加序列化ID一致这个条件,是因为它的存在对于代码的版本控制,代码安全都有不小的好处。

五)多说几句
1)关键字transient,它可使字段避免被序列化,反序列化时该字段取默认值(比如String的话就为null,int的话为0) 上述例子中 private transient String ignoreStr = "ignore";说明了该情况。
2)static 字段不会被序列化。原因也很简单,它是类的变量,不是某个实例的变量。注意上述例子中的语句 SerializeClass.staticVar = 10;
3)序列化存储规则。 对同一对象两次序列化入文件,第二次的序列化将只新增引用信息,以引用第一次序列化的对象。这样做不但可以保证反序列化后两个对象==,而且还能节省不少磁盘空间。是个非常不错的序列化规则哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值