码迷,mamicode.com
首页 > 其他好文 > 详细

序列化与反序列化

时间:2019-04-29 20:38:54      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:cti   只读   output   标记接口   磁盘   person   ash   通过   set   

定义:将类通过字节流的方式写入文件称为序列化,从类文件中通过字节流的方式读取出来称为反序列化

序列化:类要实现Serializable接口,才能序列化,Serializable接口没有任何抽象方法,是一个标记接口

try (ObjectOutputStream seri = new ObjectOutputStream(new FileOutputStream("persons.txt"))) {
            
            seri.writeObject(new Person("mili", 22));
            seri.writeObject(new Person("lili", 21));

反序列化:

try (ObjectInputStream unseri = new ObjectInputStream(new FileInputStream("persons.txt"))) {
            
            Object obj = unseri.readObject();

反序列化时,如果readObject()次数超过了文件中总共的对象数就会报错

解决办法:将所有对象添加到集合中,序列化时只序列化一个集合对象,反序列化时只读一个集合,然后遍历集合就能得到所有对象

try (ObjectOutputStream seri = new ObjectOutputStream(new FileOutputStream("persons.txt"));
                ObjectInputStream unseri = new ObjectInputStream(new FileInputStream("persons.txt"))) {
            
            Set<Person> set = new HashSet<>();
            
            set.add(new Person("mike", 22));
            set.add(new Person("mili", 22));
            set.add(new Person("lili", 21));
            
            seri.writeObject(set);
            Object uset = unseri.readObject();
            
            for (Person person : (HashSet<Person>)uset) {
                System.out.println(person);
            }

类的版本号问题:如果本地类型的版本ID和磁盘中的对象的类的版本ID不相同,就会发生InvalidClassException。避免:手动生成序列化版本ID,是否改变类型的版本,手动指定,不要自动生成
手动指定版本号private static final long serialVersionUID = 1L;

序列化与反序列化

标签:cti   只读   output   标记接口   磁盘   person   ash   通过   set   

原文地址:https://www.cnblogs.com/zhz-8919/p/10792649.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!