java序列化问题:
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