readme

多态数据反序列化的处理过程

需求分析

小水滴公司正在开发小水滴校园管理系统。其中一个重要的功能是管理和维护学生的信息和当前状态。为了将学生信息保存在文件系统中,小水滴校园管理系统需要将内存中保存的学生对象首先转化为JSON字符串,然后再存放在文件中。当需要使用学生信息时,再将其从文件中读取出来,转化为学生对象。本项目练习的是从文件中读取学生对象的一个步骤。

学生对象的定义在com.littlewaterdrop.bean包中的Student.java文件中。该类包含了四个成员变量,它们分别是(1) name,字符串类型;(2) age,整数类型;(3) major,字符串类型;和(4) courses, 链表类型。

package com.littlewaterdrop.bean;

public class Student {
    private String name = null; // 姓名
    private Integer age = null; // 年龄
    private String major = null; // 专业
    private List<Course> courses = null; // 已完成的课程

    // 在此项目中新增department成员变量
    private Department department = null;
}

现在需求发生了变化,需要在Student类中新增一个department成员变量,用于表示学生所在的院系信息。Department类定义在com.littlewaterdrop.bean包中的Department.java文件中。Department类中包含了两个成员变量,分别表示学院名称和学院中老师的人数。

package com.littlewaterdrop.bean;

public class Department {
    private String name = null;  // 学院名称
    private Integer numOfProfessors = null; // 学院中老师的人数
}

Department类是一个基类。本项目还定义两个子类,分别表示生命科学学院和计算机学院。它们分别定义在com.littlewaterdrop.bean包中的Biology.java和ComputerScience.java文件中。

在Department类的基础上,ComputerScience类新增了学院网站的地址信息。Biology类则新增了学院内实验仪器的个数信息。

package com.littlewaterdrop.bean;

public class ComputerScience extends Department {
    private String website = null;  // 学院网站地址
}

public class Biology extends Department {
    private Integer numOfDevices = null; // 学院拥有的仪器个数
}

我们假设:当一个Department对象的name成员变量的值为"Department of Computer Science"时,这个对象是一个ComputerScience对象。类似的,当一个Department对象的name成员变量的值为"Department of Biology"时,这个对象是一个Biology对象。

单层对象数据反序列化项目中,已实现了StudentInfoLoader::loadStudent()方法。因此,在本项目中,该文件的内容不再需要修改。学员需要在Student.java文件中,为Student对象添加新的成员变量department,并且使用Jackson反序列化中的多态特性,能将表示学生信息的JSON字符串转换成一个Student对象。

以下是一个JSON字符串的用例。

{
    name: 'Cindy',
    age: 19,
    major: 'Biology',
    courses: [],
    department: {
        name: 'Department of Biology',
        numOfProfessors: 10,
        numOfDevices: 40
    }
}

参考文档

  1. JSON数据格式
  2. Jackson库的工作原理和使用方法
  3. Java语言的特性
  4. Maven工程管理工具
Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.