美文网首页
JAVA序列化基本知识点

JAVA序列化基本知识点

作者: 霸体 | 来源:发表于2019-05-24 11:13 被阅读0次

/**

  • Created by zhouxiliang on 18/2/12.
    */
    public class MainUtil {
public static void main(String[] args) throws Exception {

    Man man = new Man();

    ByteOutputStream byteOutputStream = new ByteOutputStream();
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
    objectOutputStream.writeObject(man);
    objectOutputStream.flush();

    ByteInputStream byteInputStream = new ByteInputStream(byteOutputStream.getBytes(), byteOutputStream.getCount());
    ObjectInputStream objectInputStream = new ObjectInputStream(byteInputStream);
    Man copy = (Man) objectInputStream.readObject();

    System.out.println(JSON.toJSONString(copy, true));

}

/**
 * 1. serializable 接口 的对象,如果里面的某个 Field 没有 serializable 标识 会怎样
 * 2. 如果父类没有标识会怎样
 * 3. 如果子类没有标识会怎样
 */

@Data
public static class Person implements Serializable {
    private String name;
}

@Data
public static class Student extends Person {
    private String number;
    private SuperMan freind;
}

@Data
public static class SuperMan implements Serializable {
    private String star;
}

/**
 * 1. 尝试重写  writeObject 、 readObject
 * 执行顺序是从父亲类 到 子类
 */

@Data
public static class Father implements Serializable {
    private Long cardNumber;
    private String code;

    private void writeObject(ObjectOutputStream objectOutputStream) throws IOException {
        objectOutputStream.defaultWriteObject();
        objectOutputStream.writeUTF("xxdd");
        System.out.println("Father.write");
    }

    private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
        objectInputStream.defaultReadObject();
        code = objectInputStream.readUTF();
        System.out.println("father.read");
    }

}

@Data
public static class Son extends Father {
    private String name;

    private void writeObject(ObjectOutputStream objectOutputStream) throws IOException {
        objectOutputStream.defaultWriteObject();
        System.out.println("son.write");
    }

    private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
        objectInputStream.defaultReadObject();
        System.out.println("son.read");
    }
}

/**
 * 1. 尝试使用  Externalizable 接口,看下是否真的会覆盖父类的 默认序列化,导致父亲字段丢失
 */

@Data
public static class Girl implements Externalizable {
    private String hairColor;

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        System.out.println("girl.write");
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        System.out.println("girl.read");
    }
}

@Data
public static class BeautyGirl extends Girl implements Externalizable {
    private String star;

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(getHairColor());
        out.writeUTF(star);
        System.out.println("beauty.write");
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        setHairColor(in.readUTF());
        setStar(in.readUTF());
        System.out.println("beauty.read");
    }
}

/**
 * 1. 尝试使用 writeReplace  readResolve
 */

@Data
public static class Man implements Serializable {
    private String dickLen ;

    private Object writeReplace(){
        return new Man();
    }

    private Object readResolve(){
        Man man = new Man();
        man.setDickLen("3");
        return man;
    }
}

}

相关文章

网友评论

      本文标题:JAVA序列化基本知识点

      本文链接:https://www.haomeiwen.com/subject/rqlifftx.html