java序列化和反序列化
示例代码如下:
public class Person implements Serializable {//实现Serializable接口,就可以被序列化和反序列化 /*** *类序列化版本号 *如果类有变化,比如有个字段类型改了,就要改变这个值; *如果待反序列化的文件和类中的这个版本号不一致,就直接抛异常,提 *示不能反序列化到这个类型,认为类型不一致 */ private static final long serialVersionUID = 1111013L; //不需要序列化名字与年龄 private transient String name; private transient int age;//transient修饰的字段,不参与序列化和反序列化 private int height; private transient boolean singlehood; public Person(String name, int age) { this.name = name; this.age = age; } /*序列化自定义方法 *我们可以定制序列化逻辑,哪些字段序列化,哪些不,哪些字段要修改 *后序列化等等 *如果不定义这个方法,jvm会调用默认实现 *一般都不定义这个方法 */ private void writeObject(ObjectOutputStream out) throws IOException {//将名字反转写入二进制流 out.writeObject(new StringBuffer(this.name).reverse()); out.writeInt(age); } /*自定义反序列法方法,和上一个方法是对应的 *一般不定义这个方法 */ private void readObject(ObjectInputStream ins) throws IOException,ClassNotFoundException{//将读出的字符串反转恢复回来 this.name = ((StringBuffer)ins.readObject()).reverse().toString(); this.age = ins.readInt(); } /*writeObject方法被调用之前,会调用该方法,会把带序列化的对象替 *换掉,不知道有啥意义,可以不定义这个方法 */ private Object writeReplace() throws ObjectStreamException { ArrayList<Object> list = new ArrayList<>(2); list.add(this.name); list.add(this.age); return list; } /*readeObject方法被调用之后,会调用该方法,会把反序列化的对象 *丢弃,用这个方法返回的对象替换原对象,不知道有啥意义,可以不定 *义这个方法 */ private Object readResolve() throws ObjectStreamException{ return new ("brady", 23); } } public class TransientTest { public static void main(String[] args) throws Exception { try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.txt"));//ObjectOutputStream 序列化流 ObjectInputStream ios = new ObjectInputStream(new FileInputStream("person.txt"))) {//ObjectInputStream 反序列化流 Person person = new Person("9龙", 23); person.setHeight(185); System.out.println(person); oos.writeObject(person);//序列化到磁盘文件 person.txt Person p1 = (Person)ios.readObject();//从磁盘文件person.txt 反序列化到内存对象 System.out.println(p1); } } }