开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【总结】Java序列化,反序列化实例(属性类不实现序列化接口)

简介:
+关注继续查看

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

Java中String, Integer的父类都实现了序列化接口


Person类实现了序列化接口,Person中的所有属性也必须实现序列化接口,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package serialize;
import java.io.Serializable;
 
/**
 * <p>ClassName: Person<p>
 * <p>Description:测试对象序列化和反序列化<p>
 * @author 巧克力黑
 * @version 1.0 V
 * @createTime 2016-03-18
 */
public class Person implements Serializable {
 
    /**
     * 序列化ID
     */
    private static final long serialVersionUID = -5809782578272943999L;
    private String name;
    private Pet pet;
     
    public Person(String name, String sex, int age, Pet pet) {
        this.name = name;
        this.pet = pet;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Pet getPet() {
        return pet;
    }
 
    public void setPet(Pet pet) {
        this.pet = pet;
    }
}

Pet类,也是Person中的一个属性,此处Pet没有实现Serializable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package serialize;
/**
 
 * @author 巧克力黑
 * @version 1.0 V
 * @createTime 2016-03-18
 *
 */
class Pet{
    private String name;
    public Pet(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return this.name;
    }
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package serialize;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * <p>ClassName: TestSerializeAndDeserialize<p>
 * <p>Description: 测试对象的序列化和反序列<p>
 * @author 巧克力黑
 * @version 1.0 V
 * @createTime 2016-03-18
 */
public class TestSerializeAndDeserialize {
    private static Logger logger = LoggerFactory.getLogger(TestSerializeAndDeserialize.class);
     
    public static void main(String[] args) throws Exception {
        serializePerson();//序列化Person对象
        Person p = deserializePerson();//反序列Perons对象
        logger.info("name={},pet={}", p.getName(),p.getPet().toString());
    }
     
    private static void serializePerson() throws FileNotFoundException,
            IOException {
        Person person = new Person("qiaokeli""男"25new Pet("旺财"));
         
        //ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("E:/Person.txt")));
        oo.writeObject(person);
        logger.info("将Person序列化到文件");
        oo.close();
    }
    private static Person deserializePerson() throws Exception, IOException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("E:/Person.txt")));
        Person person = (Person) ois.readObject();
        logger.info("反序列化Person对象");
        return person;
    }
}

在Pet没有实现Serializable接口的情况下,看看控制台运行错误

1
2
3
4
5
6
7
8
9
Exception in thread "main" java.io.NotSerializableException: serialize.Pet
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    at serialize.TestSerializeAndDeserialize.serializePerson(TestSerializeAndDeserialize.java:36)
    at serialize.TestSerializeAndDeserialize.main(TestSerializeAndDeserialize.java:25)

FindBugs提示错误

1
2
3
Bug: Class serialize.Person defines non-transient non-serializable instance field pet
This Serializable class defines a non-primitive instance field which is neither transient, Serializable, or java.lang.Object, and does not appear to implement the Externalizable interface or the readObject() and writeObject() methods.  Objects of this class will not be deserialized correctly if a non-Serializable object is stored in this field.
Rank: Troubling (14), confidence: HighPattern: SE_BAD_FIELD Type: Se, Category: BAD_PRACTICE (Bad practice)

结论:

由于Person中的Pet属性没有实现序列化接口serializable,在执行序列化,反序列化过程中就会出错。

解决办法就是将Pet也实现序列化接口。




     本文转自巧克力黒 51CTO博客,原文链接:http://blog.51cto.com/10120275/1752503,如需转载请自行联系原作者






版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java类的初始化和清理(五)
Java类的初始化和清理
60 0
Java类的初始化和清理(四)
Java类的初始化和清理
48 0
Java类的初始化和清理(八)
Java类的初始化和清理
61 0
Java类的初始化和清理(二)
Java类的初始化和清理
57 0
Java类的初始化和清理(一)
Java类的初始化和清理
74 0
Java类的初始化和清理(三)
Java类的初始化和清理
58 0
Java类的初始化和清理(七)
Java类的初始化和清理
87 0
Java类的初始化和清理(六)
Java类的初始化和清理
64 0
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享   在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑",如果是两个字那就是"巨坑"=>因为这个需求一开始并不是这样子的,且听我漫漫道来:   一开始客户与我们商量的是将office和PDF上传,将此类文件解析成html格式,在APP端调用内置server直接以html"播放"   经历一个月~,两个月~,三个月~~~   到需求开发阶段,发现这是个坑。
1345 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Java基础入门(四)-泛型、反射、注解
立即下载
JAVA反射原理以及一些常见的应用
立即下载
Spring Cloud Alibaba - 重新定义 Java Cloud-Native
立即下载