【发布时间】:2019-04-12 04:05:15
【问题描述】:
我有一个 POJO(普通的旧 Java 对象)应用程序来表示我的数据。
在运行时,应用程序会根据需要操作和记住数据。
现在我想实现一个保存/加载功能。
我不是在询问基本文件 I/O。
我不是在问 ObjectOutputStream 是否存在。
我发现的选项如下:
1) Gson、Jackson 等 JSON/XML/YAML 库
2) 滚动您自己的二进制文件格式,使用序列化代理模式将所有内容标记为可序列化。
选项 1 不合适,因为我的数据模型可以具有循环引用。 Gson 导致堆栈溢出。
选项2不合适,因为文件应该是跨平台的并且独立于JVM;它应该适用于桌面和android java。
由于模型的复杂性,属性文件显然也不合适。
请不要攻击我的用例;我的数据模型设计得非常好。这个例子可能不是。
我现在将给出需要保存的那种结构的示例代码。
class Application {
//This College is my top level object. It could correspond to an individual save file.
College college = new College();
//I would love to be able to just throw this guy into a file.
SomeLibrary.writeToFile(college);
//And read another back.
College college2 = SomeLibrary.readFromFile(anotherCollege);
}
class College {
//The trees are implemented recursively, so this is actually just the root of each tree.
Tree<Course> artCourseTree;
Tree<Course> engineeringCourseTree;
Tree<Course> businessCourseTree;
List<Student> maleStudents;
List<Student> femaleStudents;
}
class Course {
//Each course only has 2 students in this example. Ignore.
Student student1;
Student student2;
List<Exam> examsInCourse;
LocalDate courseStartDate;
Period duration;
}
class Student {
String name;
List<Exam> listOfExamsTaken;
}
class Exam {
Student studentTakingIt;
LocalDate dateTaken;
BigDecimal score;
}
如您所见,Exams 旨在成为此模型中位于层次结构底部的原子对象。但是,它们不仅被 Student 和 Courses 引用,而且还引用回 Student 并包含非原始数据,例如 LocalDate 和 BigDecimal。该模型通过引用不同课程和学生的不同考试子集来赋予意义。
我需要保存关系、这些东西的排列、这些东西的任意数量,以及它们持有的数据。
我对保存和加载这样的模型有什么希望?
有哪些选项可以在具有此类约束的此类模型上实现保存/加载功能?
每个java程序都滚动自己的二进制文件格式并创建一个可怕的设备来序列化和反序列化所有东西真的是行业标准吗?是那个还是JSON?我在这里想念什么?我是否必须以某种方式对虚拟机进行快照?为什么没有这方面的标准做法?
【问题讨论】:
-
“硬”方式,可能是用生成的“密钥”存储“数据”(只要它对文件有效就没有关系),然后使用这些密钥存储关系一个单独的部分......你看过JAXP吗?
-
我没有详细了解 JAXP,因为我理解它是一个 XML 实用程序,我认为它在循环引用方面会受到与 JSON 相同的限制。有错吗?
-
我不能确定你的实现,但它是基于注释的,所以你可以更好地控制解析的完成方式
-
我也在制定一些解决方案,在其中减少对某些唯一对象标识符的引用(例如 toString() 或其他东西)并分别存储对象及其关系。我会坚持一个更简单的解决方案。
-
与 ms office “搞混”,他们倾向于做类似的事情????
标签: java