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

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}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

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