您的位置:首页 > 编程语言 > Java开发

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

2017-08-17 15:01 579 查看
深入分析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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 对象