java序列化问题

java序列化问题:

  1. Serializable

    Student.java

    import java.io.Externalizable;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectOutput;
    import java.io.Serializable;
    
    
     /* Title:学生类 Description:实现序列化接口的学生类 Copyright: copyright2018
     * Filename:
     * Student.java
     * 
     * @author He Li Ming
     */ @version 1.0
    
    public class Student implements Serializable {
        /**
     * 坑1.类里一定要serialVersionUID否则旧数据会反序列化失败
     * 坑2.一旦序列化保存到磁盘操作后,就不要修改类名了,否则旧数据会反序列化失败
     * 记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构
     * 尽量把对象转换成json保存更稳妥。
     */
    private static final long serialVersionUID = 5175151654234923238L;
    private String name;
    private transient char sex;//属性上加入transient可以在实现了Serializable接口的类中隐藏属性
    private int year;
    private double gpa;
    
    public Student() {
    
    }
    
    public Student(String name, char sex, int year, double gpa) {
        this.name = name;
        this.sex = sex;
        this.year = year;
        this.gpa = gpa;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public void setSex(char sex) {
        this.sex = sex;
    }
    
    public void setYear(int year) {
        this.year = year;
    }
    
    public void setGpa(double gpa) {
        this.gpa = gpa;
    }
    
    public String getName() {
        return this.name;
    }
    
    public char getSex() {
        return this.sex;
    }
    
    public int getYear() {
        return this.year;
    }
    
    public double getGpa() {
        return this.gpa;
    }
    }
    

    UseStudent.java

    import java.io.*;
    
    /**
     *Title:应用学生类
     *Description:实现学生类实例的序列化与反序列化
     *Copyright: copyright(c) 2012
     *Filename: UseStudent.java
     *@author He LiMing
     *@version 1.0
     */
    
    public class UseStudent
    {
     public static void main(String[] args)
     {
      Student st = new Student("Tom",'M',20,3.6);
      File file = new File("e:\\20171204.txt");
      try
      {
       file.createNewFile();
      }
      catch(IOException e)
      {
       e.printStackTrace();
      }
      try
      {
       //Student对象序列化过程
       FileOutputStream fos = new FileOutputStream(file);
       ObjectOutputStream oos = new ObjectOutputStream(fos);
       oos.writeObject(st);
       oos.flush();
       oos.close();
       fos.close();
    
       //Student对象反序列化过程
       FileInputStream fis = new FileInputStream(file);
       ObjectInputStream ois = new ObjectInputStream(fis);
       Student st1 = (Student) ois.readObject();
       System.out.println("name = " + st1.getName());
       System.out.println("sex = " + st1.getSex());
       System.out.println("year = " + st1.getYear());
       System.out.println("gpa = " + st1.getGpa());
       ois.close();
       fis.close();
      }
      catch(ClassNotFoundException e)
      {
       e.printStackTrace();
      }
      catch (IOException e)
      {
       e.printStackTrace();
      }             
     }
    }
    
    //控制台
    name = Tom
    sex = 
    year = 20
    gpa = 3.6
    

    2.Externalizable

    ExternalizableTest.java

    import java.io.Externalizable;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInput;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutput;
    import java.io.ObjectOutputStream;
    
    /**
     *Title:应用工资类
     *Description:实现工资类实例的序列化与反序列化
     *Copyright: copyright(c) 2012
     *Filename: ExternalizableTest.java
     *@author He LiMing
     *@version 1.0
     */
    
    public class ExternalizableTest implements Externalizable {
    
    private transient String content ;
    private transient String username ;
    private transient String password  ;
    private transient String money  ;
    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(content);
        out.writeObject(username);//如果我们不将content和username的值写入的话,那么在反序列化的时候,就不会得到这些值。
    }
    
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        content = (String) in.readObject();//在反序列化时,需要初始化content和username,否则只是调用默认构造函数,得不到content和username的值
        username = (String) in.readObject();
    }
    public static void main(String[] args) {
    
    ExternalizableTest externalizableTest = new ExternalizableTest("我会被序列化,不管我是不是transient修饰的哈!","我也会被序列化admin!","123456!","500万!");
    
    try {
        ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File(
                "test")));
        out.writeObject(externalizableTest);
    
        ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
                "test")));
        try {
            externalizableTest = (ExternalizableTest) in.readObject();
             System.out.println(externalizableTest.content);
             System.out.println(externalizableTest.username);
             System.out.println(externalizableTest.password);
             System.out.println(externalizableTest.money);
             out.close();
             in.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    System.exit(0);//解决控制台报错
    }
    
    public ExternalizableTest(String content, String username, String password, String money) {
        super();
        this.content = content;
        this.username = username;
        this.password = password;
        this.money = money;
    }
    
    public ExternalizableTest() {
        super();
    }
    
    public String getContent() {
        return content;
    }
    
    public void setContent(String content) {
        this.content = content;
    }
    
    public String getUsername() {
        return username;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password = password;
    }
    
    public String getMoney() {
        return money;
    }
    
    public void setMoney(String money) {
        this.money = money;
    }
    
    
    }
    
    //控制台
    我会被序列化,不管我是不是transient修饰的哈!
    我也会被序列化admin!
    null
    null

猜你喜欢

转载自blog.csdn.net/qq_37954693/article/details/80064732
今日推荐