通过序列化保存我的对象或制作XML文件

时间:2014-12-19 18:48:51

标签: java serialization xml-serialization

我想要构建一个应用程序,这是我的第一次,所以我想出了一个两难的问题。在我的应用程序中,我有PersonsProjects,其中有一个属性。一个项目是由一些人完成的,每个项目都有一个协调员。

public class Person
{
    private String firstName;
    private String lastName;
    private String mailAddress;
    private String ID;

   //more
}

我也有一名协调员:

public class Coordinator extends Person
{
       private String type;
       //more code
}

然后我有项目

public class Project
{
    private String projectInfo;
    private String nameOfProject;
    private int projectID;
    //more code
}

我的困境是这样的。我应该将所有对象存储到列表或HasMap,然后通过对象序列化存储到我的磁盘,还是应该创建XML表示(如下所示),然后使用DOM解析器读取我的XML?在XML方式中,每次我运行应用程序时,我都必须再次创建我的对象,对吧?与序列化相反,我将再次从磁盘读取我的对象。

<project>
    <active></active>
    <complete></complete>
    <name></name>
    <info></info>
    <coordinator></coordinator>
    <level1> //each project is distributed to different levels.
        <cordinator> </cordinator>
        <budget></budget>
        <startDate></startDate>
        <endDate></endDate>
        <totalTasks> </totalTasks>
        <complete></complete>
        <task1>
            <cordinator> </cordinator>
            <personInvolved></personInvolved>
            <personInvolved></personInvolved>
            <personInvolved></personInvolved>
            <personInvolved></personInvolved>
            <budget></budget>
            <startDate></startDate>
            <endDate></endDate>
            <complete></complete>
        </task1>
        <task2>
            //same as task1
        </task2>
    </level1>
    <level2>
            //same as level1
    </level2>
</project>

2 个答案:

答案 0 :(得分:1)

使用Java或XML进行序列化之间的选择并不取决于您要将其序列化的位置。两者都可以保存到文件中。 Java序列化依赖于读取文件的每个进程都是Java程序的事实。 (除了Java程序之外,什么都不能读取该格式。)然而,XML是关于互操作性的。任何类型的程序都可以读取XML文件并通过某种库(JAXB或其他非Java XML序列化库)加载该数据。

随着类的改变,维护序列化Java对象的兼容性会很麻烦,但它并非不可克服。我不尝试。如果这是你的一个因素,你可能想要考虑XML,即使只有Java程序会读它。

所以问题是 - 谁需要阅读您正在撰写的数据,以及您最初编写数据的需求是什么?

答案 1 :(得分:0)

我认为最好的方法是序列化,你可以写下你想要的对象并轻松阅读它:

  • Here一个有用的例子
  • Here官方文档形成Oracle

序列化人物p:

try {
     FileOutputStream fileOut = new FileOutputStream("/tmp/your_filename.ser");
     ObjectOutputStream out = new ObjectOutputStream(fileOut);
     out.writeObject(p);
     out.close();
     fileOut.close();
}
catch(IOException i) {
     // error management
}

反序列化人员p:

try {
     FileInputStream fileIn = new FileInputStream("/tmp/your_filename.ser");
     ObjectInputStream in = new ObjectInputStream(fileIn);
     p = (Person) in.readObject();
     in.close();
     fileIn.close();
}
catch(IOException i) {
     // error management
}
catch(ClassNotFoundException c) {
     // error management
  }