JavaSE---对象序列化与反序列化

/**
     * 【对象的序列化与反序列化】
     *      1、当 2个进程 远程通信时,彼此都可以发送各种类型的数据,如文本、图片、语音、视频等;
     *          无论是何种类型的数据,都会以 二进制序列 的形式在网络上传送;
     *
     *      2、对象的序列化:
     *          把Java对象 转换为 字节序列;
     *
     *         对象的反序列化:
     *          把字节序列 转为 为 Java对象;
     *
     *      3、对象序列化的用途:
     *          把对象的字节序列 永久 保存在磁盘,通常放在一个文件中;
     *          在网络上 传送 对象的字节序列;
     */

  

 /**
     * 【JDK类库的序列化API】
     *
     *      只有实现了 java.io.Serializable或java.io.Externalizable 接口的对象 才能被 序列化,否则 将会 抛出 IOException;
     *
     *      java.io.ObjectOutputStream:
     *          对象输出流;
     *          writeObject 对指定的对象 进行序列化,将 得到的字节序列 写入到目标输出流中;
     *
     *      java.io.ObjectInputStream:
     *          对象输入流;
     *          readObject 从输入流中 读取字节序列,将字节序列 反序列化为 Java对象;
     *
     *      java.io.Serializable:
     *          仅实现Serializable的类 采用 默认的序列化方式;
     *              默认序列化方式:
     *                  对实现类的非transient实例变量进行序列化;
     *                  static 变量也不会序列化;
     *              默认反序列化方式:
     *                  对实现类的非transient实例变量进行反序列化;
     *
     *      java.io.Externalizable:
     *          继承自Serializable,实现Externalizable的类 完全 由自身 控制 序列化的行为;
     *
     */

  

/**
     * 【控制序列化行为】
     *          1、自定义类型 实现 java.io.Serializable
     *              自定义
     *                  private void writeObject(ObjectOutputStream stream)throws IOException {}
     *                  private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {}
     *
     *                  【修饰符必须为private】
     *
     *          2、自定义类型 实现 java.io.Externalizable
     *              重写
     *                  void writeExternal(ObjectOutput out) throws IOException;
     *                  void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
     *
     *          3、自定义类型 实现 java.io.Serializable
     *              自定义
     *                  private Object readResolve() throws ObjectStreamException{}
     *                      重新指定反序列化得到的对象;
     *                  private Object writeReplace(){}
     *                      重新指定序列化的对象,此方法返回的对象才是 真正的序列化对象
     *
     *                  【修饰符可以为private、protected、默认】
     *
     */

  

/**
     * 【可序列化类的版本】
     *      凡是实现java.io.Serializable接口的类,都有一个表示 序列化版本的常量 private static final long serialVersionUID(Java运行时环境 根据类的内部细节 自动生成的);
     *          如果源码做了修改,需要重新编译,新生成的class文件的serialVersionUID也会变化;
     *
     *      为了提高serialVersionUID的独立性和确定性,建议在可序列化类中 显式指定 serialVersionUID;
     */

  

import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 * @author apy
 * @description
 * @date 2022/2/23 15:12
 */
public class Test {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

//        User user = new User();
//        user.setAge(1);
//        user.setName("jack");
//        User.setJob("teacher");

        BUser bUser = new BUser();
        bUser.setName("rose");
        bUser.setAge(2);


        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("/Users/an/IdeaProjects/demo/javase/src/main/java/com/an/serilaizedeserilaize/user.obj"));
        objectOutputStream.writeObject(bUser);

        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("/Users/an/IdeaProjects/demo/javase/src/main/java/com/an/serilaizedeserilaize/user.obj"));
        Object object = objectInputStream.readObject();
        System.out.println(object);
    }
}

class User implements Serializable{

    private static final long serialVersionUID = 1L;

    transient int age;
    String name;

    static String job;

    public static String getJob() {
        return job;
    }

    public static void setJob(String job) {
        User.job = job;
    }

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    private void writeObject(ObjectOutputStream stream)throws IOException {
        System.out.println("my  writeObject");
    }

    private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
        System.out.println("my  readObject");
    }

    private Object readResolve() throws ObjectStreamException {
        System.out.println("my  readResolve");
        return this;
    }

    private Object writeReplace(){
        System.out.println("my writeReplace");
        return this;
    }
}

class BUser implements Externalizable{

    public BUser(){

    }

    public BUser(int age, String name){
        this.age = age;
        this.name = name;
    }

    transient int age;
    String name;

    static String job;

    public static String getJob() {
        return job;
    }

    public static void setJob(String job) {
        User.job = job;
    }

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

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

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

  

posted on 2019-02-14 10:17  anpeiyong  阅读(115)  评论(0编辑  收藏  举报

导航