• 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知道,去问吧。

  • 相关阅读:
    c#中ref与out区别
    【转载】Firebug中net面板的使用
    结构声明、定义
    开始旅程了
    strcpy、strcat、strcmp、strlen
    #include 格式
    宏定义
    MySQL 字段类型
    MySQL 约束类型
    (转载)C#语言之“string格式的日期时间字符串转为DateTime类型”的方法
  • 原文地址:https://www.cnblogs.com/tju-gsp/p/3600921.html
Copyright © 2020-2023  润新知