Java的序列化

1、为啥需要序列化

  在Java编程时,一个类被实例化以后,Java虚拟机使得对象处理生存状态,但是当虚拟机关闭后,对象就不复存在了,所以一个对象的生存期不会超过JVM的工作时间,那么如何才能让对象持续存在呢?Java的序列化API提供了相关的方法。当然,在RMI中或者将对象在网络传输时都需要其象序列化。本文就对象的持久化进行阐释,RMI和网络传输的序列化应用,以后慢慢说。

2、如何进行序列化。

  Java的API为对象的序列化提供了简单强大的方式:实现Serializable。那到底怎么用呢?直接看例子,例子比任何理论都来的直接。

首先,我们定义一个类 book,这个类有三个成员变量:author,price、date;{作者,价格、出版日期}。如何将其序列化并且保存到文件中呢?看代码。

public class book  implements Serializable
{
    private String author;
    private float  price;
    private Date   date;

    public book(){
    
        System.out.println("Empty Constructor");
    }

    public book(String a; float p; Date d){
        this.author = a;
        this.price = p;
        this.date = d;
        System.out.println("Arguments Constructor");
    }

    public String getAuthor(){
        return this.author;
    }
    public  float getAuthor(){
        return this.author;
    }
    public  Date getAuthor(){
        return this.author;
    }
    public void setAuthor(String a){
        this.author = a;
    }
    public void setPrice(float p){
        this.price = p;
    }
    public void setDate(Date d){
        this.date = d;
    }

    public static void main(String args[])
    {
        book b = new book("you",99.99,new Date());

        File file = new File("booklist");

        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
        
        out.writeObject(b);
        out.close();

        ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
        Object in_book = in.readObject();  
        in.close();
        System.out.println( in_book.getAuthor()+ " " + in_book.getPrice() + "  " + in_book.getDate());
    }
}
View Code

  当然,这个代码我没测试过,有兴趣不?要不要自己试试?但是要记住一点:确保该读取程序的CLASSPATH中包含有book.class(哪怕在读取book对象时并没有显示地使用这个类),否则会抛出ClassNotFoundException。

3、我想自己写序列化的过程咋办。

  要是觉得不想这么中规中矩的使用Serializable进行序列化,那可以用序列化的继承子类Externalizable接口实现自己的序列化。咋用啊?继续看代码。

public class book  implements Externalizable
{
    private String author;
    private float  price;
    private Date   date;

    public book(){
    
        System.out.println("Empty Constructor");
    }

    public book(String a; float p; Date d){
        this.author = a;
        this.price = p;
        this.date = d;
        System.out.println("Arguments Constructor");
    }

    public String getAuthor(){
        return this.author;
    }
    public  float getAuthor(){
        return this.author;
    }
    public  Date getAuthor(){
        return this.author;
    }
    public void setAuthor(String a){
        this.author = a;
    }
    public void setPrice(float p){
        this.price = p;
    }
    public void setDate(Date d){
        this.date = d;
    }


    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(author);
        out.writeInt(age);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        author = (String) in.readObject();
        age    = in.readInt();
    }
}
View Code

      关键还是看俩函数 writeExternal() 、readExternal()。这俩函数可以让程序员自己决定到底用什么样的方式进行序列化。注意:序列化的是类的成员变量,成员函数不会序列化,所以自己写序列化别把函数什么的也写进去,写了?那就只能“呵呵”。。。

  人懒的好处就是胆子大,这个代码我也没测过,直接贴。

4、 还有一个关键字我没写:transient。这个关键字可以让某些成员变量不被序列化,咋用呢?google知道,去问吧。

原文地址:https://www.cnblogs.com/tju-gsp/p/3600921.html