Java序列化和反序列化例子

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

序列化简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

反序列化正好相反,就是将保存的对象读出来,实例为对象。

下面是一个完整而形象的例子:

/** 
 * 对象序列化与反序列化 
 * 
 */  
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;  

/* 需要持久化的类 
 * 要想使类支持对象序列化,只需要实现Serializable接口 
 */  
class Person implements Serializable {  

    private static final long serialVersionUID = 3456126674259028540L;  
    /* 属性 */  
    private String id;  
    private String password;  
    private String name;  
    private int age;  
    // 如果不想对某些属性进行序列化,则需加上transient修饰符  
    private transient String sex;  

    /* setter和getter方法 */  
    public String getId() {  
        return id;  
    }  

    public void setId(String id) {  
        this.id = id;  
    }  

    public String getPassword() {  
        return password;  
    }  

    public void setPassword(String password) {  
        this.password = password;  
    }  

    public String getName() {  
        return name;  
    }  

    public void setName(String name) {  
        this.name = name;  
    }  

    public int getAge() {  
        return age;  
    }  

    public void setAge(int age) {  
        this.age = age;  
    }  

    public String getSex() {  
        return sex;  
    }  

    public void setSex(String sex) {  
        this.sex = sex;  
    }  

    /* 覆盖toString方法 */  
    public String toString() {  
        return "对象信息:" + id + " " + password + " " + name + " " + age + " "  
                + sex;  
    }  

}  

/* 
 * 实现了对象序列化和反序列化的类 
 */  
public class SeriObject {  

    /** 
     * 序列化 
     *  
     * @param person 
     *            对象名 
     * @param file 
     *            指定文件 
     */  
    public void writePerson(Person person, String file) {  
        try {  
            // 对象输出流,指向指定文件  
            ObjectOutputStream out = new ObjectOutputStream(  
                    new FileOutputStream(file));  
            out.writeObject(person);// 将对象写入文件  
            out.flush();// 清空  
            out.close();// 关闭  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  

    }  

    /** 
     * 反序列化 
     *  
     * @param file 
     *            指定文件 
     */  
    public void readPerson(String file) {  
        try {  
            // 对象输入流,来源于指定文件  
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(  
                    file));  
            Object o = in.readObject();// 将对象从文件读出  
            in.close();// 关闭  
            if (o != null) {  
                if (o instanceof Person)  
                    System.out.println(o.toString());  
            }  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        }  
    }  

    public static void main(String[] args) {  
        /* 
         * 测试代码 
         */  
        Person person = new Person();  
        person.setId("aaa");  
        person.setPassword("bbb");  
        person.setName("张三");  
        person.setAge(20);  
        person.setSex("男");  

        SeriObject so = new SeriObject();  
        so.writePerson(person, "person.txt");  
        so.readPerson("person.txt");  
    }  

}  

标签: 代码

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:一个python写的去c语言注释的小脚本

下一篇:PHPMailer发送邮件