readme

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

需求分析

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

学生对象的定义在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类是一个基类。本项目还定义两个子类,分别表示生命科学学院(Biology)和计算机学院(ComputerScience)。它们分别定义在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反序列化中的多态特性,能将表示学生信息的YAML字符串转换成一个Student对象。

以下是一个YAML字符串的用例。注意,major字段和department字段的含义是相匹配的。

---
name: "Adam"
age: 21
major: "Biology"
courses: []
department:
  name: "Department of Biology"
  numOfProfessors: 10
  numOfDevices: 40

参考文档

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