序列化与反序列化

来源:互联网 发布:sql和access的区别 编辑:程序博客网 时间:2024/05/21 10:24

1、 什么是序列化和反序列化
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。
2、 什么情况下需要序列化
a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
3、 如何实现序列化
将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。
4、序列化和反序列化例子
如果我们想要序列化一个对象,首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构)。而反序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。
5、序列化ID
序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。这也可能是造成序列化和反序列化失败的原因,因为不同的序列化id之间不能进行序列化和反序列化。
注意:被static,transient修饰的变量不能被序列化;

代码:
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;
import java.util.Arrays;

class Animal implements Serializable {
/**
*
*/
private static final long serialVersionUID = 8822818790694831649L;
private String name;
private String color;
private String[] alias;

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 String[] getAlias() {    return alias;}public void setAlias(String[] alias) {    this.alias = alias;}@Overridepublic String toString() {    return "Animal [alias=" + Arrays.toString(alias) + ", color=" + color            + ", name=" + name + "]";}// 序列化: 是一种将对象以一连串的字节描述的过程static void serializable() throws FileNotFoundException, IOException{    ObjectOutputStream oos = null;    try {        oos = new ObjectOutputStream(new FileOutputStream("D://animal.dat"));        Animal animal = new Animal();        animal.setName("加菲");        animal.setColor("Black");        animal.setAlias(new String[]{"xiaoHei", "Gou", "GuaiGuai"});        oos.writeObject(animal);        oos.flush();    } finally {        if(null != oos){            oos.close();        }    }}//反序列化:是一种将这些字节重建成一个对象的过程static void unserializable() throws FileNotFoundException, IOException, ClassNotFoundException{    ObjectInputStream ois = null;    try {        ois = new ObjectInputStream(new FileInputStream("D://animal.dat"));        Animal animal = (Animal) ois.readObject();//由Object对象向下转型为Animal对象        System.out.println(animal);        System.out.println(animal.getColor());        System.out.println(animal.getName());        System.out.println(animal.getAlias());    } finally {        if( null != ois ){            ois.close();        }    }}public static void main(String[] args) {

// try {
// Animal.unserializable();
// } catch (Exception e) {
// e.printStackTrace();
// }
//
try {
Animal.serializable();
} catch (Exception e) {

        e.printStackTrace();    }}

}

原创粉丝点击