• 欢迎访问天天编码网站,Java技术、技术书单、开发工具,欢迎加入天天编码
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏天天编码吧
  • 我们的淘宝店铺已经开张了哦,传送门:https://shop145764801.taobao.com/

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

Java基础 tiantian 2070次浏览 1个评论 扫描二维码

在Java中,使用一个字节序列来表示一个对象就成为对象的序列化。这个字节序列会包含该对象的数据和元信息。一个序列化后的对象,可以被写入到文件或者数据库中,持久地存储起来。同时,文件或者数据库中的序列化对象也可以被读取出来,并反系列化为一个对象,这些代表对象和其数据的字节,可以在内存中被用来重新创建出该对象。

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

作用

正如我们所知,序列化的最主要作用就是用来传递对象。当我们需要跨网络或者跨文件来传递对象时,序列化就该发挥作用了。无论是网络基础设施,还是底层硬盘,都只认识和存储字节,而不能直接存储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 + ".");
}
}
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.

注意,为了演示代码的简化,我们没有使用正确的关闭文件的方案。


天天编码 , 版权所有丨本文标题:深入分析Java的序列化(Serialization)
转载请保留页面地址:http://www.tiantianbianma.com/java-serialization.html/
喜欢 (5)
支付宝[多谢打赏]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 水电费
    匿名2017-08-15 17:31 回复 Windows 10 | Chrome 53.0.2785.104