4

コマンドで保存する必要があるプロジェクトデータがたくさんある大規模なGUIプログラムを開発していますlocally

現在、すべてのグローバル データ構造を保存クラス (プロジェクト) に保存してから、それらをローカル ハードディスク ファイルにシリアル化しています。

public void saveChanges() {
    ArrayList<Student> studentList = new ArrayList<>();
    ArrayList<String> coursesList = new ArrayList<>();
    ArrayList<Requirement> reqList = new ArrayList<>();
    ArrayList<Risk> riskList = new ArrayList<>();
    for (int x = 0; x < dlm.getSize(); x++) {
        studentList.add(dlm.elementAt(x));
    }
    for (int x = 0; x < dlm2.getSize(); x++) {
        coursesList.add(dlm2.elementAt(x));
    }
    for (int x = 0; x < dlm3.getSize(); x++) {
        reqList.add(dlm3.elementAt(x));
    }
    for (int x = 0; x < riskTable.getRowCount(); x++) {
        riskList.add((Risk) riskMap.get(dtm1.getValueAt(x, 0)));
    }

    project.setStudentAL(studentList);
    project.setCoursesAL(coursesList);
    project.setReqAL(reqList);
    project.setRiskAL(riskList);
    project.setLastUpdated(new Date().toString());

}

今、私はこれをローカルファイルにシリアライズしています:

public void saveProject(boolean defaultPath, String path) {
    saveChanges();
    FileOutputStream outFile;
    try {
        if (defaultPath) {
            outFile = new FileOutputStream(directory + project.getProjectName() +    ".proj");
        } else {
            outFile = new FileOutputStream(path + ".proj");
        }
        ObjectOutputStream outObject = new ObjectOutputStream(outFile);
        outObject.writeObject(project);
        outObject.close();
    } catch (IOException e) {
        System.out.println("Failed to save project");
        e.printStackTrace();
    }
}

私の質問は次のとおりです。デフォルトはありますか。ローカルのハードドライブにファイルを保存するより良い方法はありますか? XML や DB を使用したくありません。

  • 前もって感謝します
4

3 に答える 3

2

私の意見でserializationは、適切な場所で使用するのは非常に難しいものです。
メンテナンスの必要性が低く、セットアップが簡単なため、プレースホルダーとして使用されることもあります。ただし、(自動)シリアライゼーションを特効薬として使用することに対する私のポイント(誤解しないでください。シリアライゼーションは楽しく、その使用が適切な場合がたくさんあります)は次のとおりです。

  • 速度: 標準の Java シリアル化は低速です。必ずというわけではありませんが、準備なしで使用した場合。回避策: writeObject/readObjectメソッドを所有してください。

  • バージョニング: 確かに、古すぎるもの (serialVersionUID) をデシリアライズしないように注意を払いますが、内部構造をアップグレードすることはできません。内部でやり方を変えると、古いセーブは役に立たなくなります。

  • バイナリ形式: 標準の Java シリアル化に固執しています... 別の形式に (回避策なしで) 変更することも、別の言語から読み取ることもできません...

1つの代替案:

データベースやxmlが必要ないようです(JSONもダメだと思います)。後は独自のフォーマットを設計し、データをバイナリ形式で書き込むだけです。これにより、最大限の柔軟性が得られ (テキスト形式よりも簡単だとは言えません)、正しく適用されれば、Java シリアル化や xml よりもはるかに高速になります。

ただし、利点には代償が伴います。単純にそれを行う事前構築されたシステムはありません (どのように存在する必要がありますか?) 。Java シリアライゼーションよりも多くのコードを記述する必要があり、(大きな) 構造化されたバイナリ ファイルはデバッグが煩わしい場合があります...

:

Data というオブジェクトがあるとします。float の配列が含まれています。writeObject では、その配列のサイズを書き込んでから、各フロートをストリームに書き込みます。
readObject では、配列のサイズを読み取り、そのサイズの配列を作成して、配列内の各要素に読み取り浮動小数点数を入力します。

于 2013-08-27T17:58:23.477 に答える