序列化、反序列化代码示例

1、序列化、反序列化接口

/**
 * 序列化、反序列化接口
 */
public interface ISerialization {
    // 序列化
    <T> byte[] serializer(T obj);
    // 反序列化
    <T> T deSerializer(byte[] data,Class<T> clazz);
}

2、实现自己定义的接口



/**
 * 序列化 反序列化 操作
 * 序列化就是:程序运行必定在内存中;
 * 从正在运行的程序中,即内存中将数据;
 * 序列化 便于存储到磁盘(硬盘)中,
 * 或者便于网络传输到其他机器上
 * 反序列化:将磁盘(硬盘)中,序列化好的内容,读取到正在运行的程序中,即内存
 */
public class JavaSerializer implements ISerialization {
      @Override
    public <T> byte[] serializer(T obj) {
        ObjectOutputStream objectOutputStream=null;
        try {
            objectOutputStream=new ObjectOutputStream(new FileOutputStream(new File("user")));
            objectOutputStream.writeObject(obj);
           

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(objectOutputStream!=null){
                try{
                    objectOutputStream.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    @Override
    public <T> T deSerializer(byte[] data, Class<T> clazz) {
        ObjectInputStream objectInputStream=null;

        try {
            objectInputStream =new ObjectInputStream(new FileInputStream(new File("user")));
            return (T)objectInputStream.readObject();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(objectInputStream!=null){
                try {
                    objectInputStream.close();
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        }

        return null;
    }
}

3、实体类

注意;
1、Serializable必须得实现java自带的序列化接口
2、使用IDEA 自带的 serialVersionUID ,不能删除 ;删除不能发序列成功
public class User  implements Serializable{
     // 序列化值   不能删除 ,如果删除 ,那么反序列化就不能把文件读取出去
    private static final long serialVersionUID = -2236182038380256247L;   
   
    private String name;
    private int age;

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

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

    public User() {
    }

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

Image.png
Image2.png

4、测试

public class Demo {
    public static void main(String[] args) {
        // ----------注释start1
        ISerialization iSerialization=new JavaSerializer();
        User user=new User();
        user.setAge(18);
        user.setName("Mic");
        byte[] serialByte=iSerialization.serializer(user); // 序列化
        // ----------注释end1
        // 运行 之后 产生一个user文件
        User dUser=iSerialization.deSerializer(serialByte,User.class);// 反序列化
        System.out.println(dUser);
    }
   
}

运行结果

产生一个user文件;

User{name='Mic', age=18}

我们把User中的 private static final long serialVersionUID = -2236182038380256247L; 注释掉

然后改写Demo中的方法

  public static void main(String[] args) {
        ISerialization iSerialization=new JavaSerializer();
    
        byte[] serialByte= file2byte("E:/MyCode-Gupao/serialization/user");
        User dUser=iSerialization.deSerializer(serialByte,User.class);
        System.out.println(dUser);
    }


    // 读取文件成字节数组
    public static byte[] file2byte(String path)
    {
        try {
            FileInputStream in =new FileInputStream(new File(path));
            //当文件没有结束时,每次读取一个字节显示
            byte[] data=new byte[in.available()];
            in.read(data);
            in.close();
            return data;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

运行之后,报错

java.io.InvalidClassException: serialization.User; local class incompatible: 
stream classdesc serialVersionUID = -2236182038380256247, 
local class serialVersionUID = -3132643898329134254
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:687)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1876)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1745)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2033)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
    at serialization.JavaSerializer.deSerializer(JavaSerializer.java:104)
    at serialization.Demo.main(Demo.java:30)
null

所以如果使用IDEA 的serialVersionUID 不能删除


我们也可以将上面的第1步保留,其他的都重新改写

2、 实现自己定义的接口

public class JavaSerializer implements ISerialization {
    @Override
    public <T> byte[] serializer(T obj) {
        ByteArrayOutputStream byteArrayOutputStream =
                new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = null;
        try {
            objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(obj);
            return byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (objectOutputStream != null) {
                try {
                    objectOutputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    byteArrayOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
        return null;
    }

    @Override
    public <T> T deSerializer(byte[] data, Class<T> clazz) {
        ByteArrayInputStream byteArrayInputStream =
                new ByteArrayInputStream(data);
        ObjectInputStream objectInputStream = null;
        try {
            objectInputStream = new ObjectInputStream(byteArrayInputStream);
            return (T)objectInputStream.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        finally {
            if (objectInputStream != null) {
                try {
                    objectInputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
        return null;
    }
}

3、实体类

public class User  implements Serializable{
    private String name;
    private int age;

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

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

    public User() {
    }

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

这里写图片描述

这里写图片描述

4、测试类

public class Demo {
    public static void main(String[] args) {
        ISerialization iSerialization=new JavaSerializer();
        User user=new User();
        user.setAge(18);
        user.setName("Mic");
        byte[] serialByte=iSerialization.serializer(user);
        // 运行 之后 产生一个user文件

        User dUser=iSerialization.deSerializer(serialByte,User.class);
        System.out.println(dUser);
    }

运行结果

User{name='Mic', age=18}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 10,931评论 0 24
  • 前言 本开发规范基于《阿里巴巴Java开发手册终极版》修改,并集成我们自己的项目开发规范,整合而成。 为表示对阿里...
    4ea0af17fd67阅读 5,667评论 0 5
  • 无论生活怎么不如意,都记得要充满正能量,我理解的正能量是没有抱怨,每一天都心怀感恩,每一天说积极向上、赞美的话语。...
    xiaoyanzi888阅读 116评论 0 1
  • (楔子)我这一生,最爱他,最恨她,最讨厌我自己。 (一)二零零八年九月这是个特殊的年份,欢乐与悲伤都来得太过迅猛,...
    金一晌阅读 561评论 1 1
  • 莫奈喜爱自然光对眼睛所见的影响,酷爱呈现颜色以及颜色的变幻,善于把握瞬间的印象,达到了前所未有的专注,敏锐,表现,...
    晚霞消失之时阅读 255评论 0 0