深入分析Java的序列化(Serialization)

深入分析Java的序列化(Serialization)
在Java中,使用一个字节序列来表示一个对象就成为对象的序列化。这个字节序列会包含该对象的数据和元信息。一个序列化后的对象,可以被写入到文件或者数据库中,持久地存储起来。同时,文件或者数据库中的序列化对象也可以被读取出来,并反系列化为一个对象,这些代表对象和其数据的字节,可以在内存中被用来重新创建出该对象。
作用
正如我们所知,序列化的最主要作用就是用来传递对象。当我们需要跨网络或者跨文件来传递对象时,序列化就该发挥作用了。无论是网络基础设施,还是底层硬盘,都只认识和存储字节,而不能直接存储Java的对象。序列化把Java对象转换成字节,并利用网络进行传输,或直接保存到文件(硬盘)中。
在什么情况下,我们会需要存储和传递一个Java对象呢?以我个人的编程经历来看,通常有如下的一些原因会促使我使用Java的序列化机制。
1. 一个对象的创建需要依赖于非常多的上下文环境。一旦该对象创建完毕,它的方法和属性会被其他的组件所使用。
2. 当一个对象创建完毕,并包含有很多的属性时,我们暂时不知道如何入使用它们,所以暂时把它们存储到数据库或文件中。
代码示例
下面,我们看一个例子:如何使类称为一个可序列化的类,如何序列化,如何反序列化。
public class Dog implements Serializable {
private static final long serialVersionUID = -5742822984616863149L;
private String name;
private String color;
private transient int weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public void introduce() {
System.out.println("I have a " + color + " " + name + ".");
}
}
序列demo:
public class SerializeDemo {
public static void main(String[] args) {
//create an object
Dog e = new Dog();
e.setName("bulldog");
e.setColor("white");
e.setWeight(5);
//serialize
try {
FileOutputStream fileOut = new FileOutputStream("./dog.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized dog is saved in ./dog.ser");
} catch (IOException i) {
i.printStackTrace();
}
e = null;
//Deserialize
try {
FileInputStream fileIn = new FileInputStream("./dog.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Dog) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Dog class not found");
c.printStackTrace();
return;
}
System.out.println("\nDeserialized Dog ...");
System.out.println("Name: " + e.getName());
System.out.println("Color: " + e.getColor());
System.out.println("Weight: " + e.getWeight());
e.introduce();
}
}
我们来看一下程序的输出:
Serialized dog is saved in ./dog.ser
Deserialized Dog...
Name: bulldog
Color: white
Weight: 0
I have a white bulldog.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值