2

データを保存/ロードする可能性があるアプリケーションに取り組んでいます。ほとんどのデータは、クラスのインスタンスに格納されます。インスタンス内のデータは次のもので構成されます。

  • double[][]配列_
  • 一部String, int, boolおよび一部の列挙子

これらのインスタンスが複数あり、1 つのファイルに保存したいグローバル データがいくつかあります。

これまでのところ、すべてをバイナリデータとして保存します。

DataOutputStream out = new DataOutputStream(FileOutputStream(file));
out.writeInt()/writeBoolean()/writeUTF()/etc

これはうまく機能しますが、問題はあまり柔軟ではないことです。コンテナー クラスにいくつかの変数を追加/削除した場合、古い形式に互換性を持たせる簡単な方法はありません。ファイルの先頭に追加するバージョン番号を使い始めました。ただし、これにより、すべてのフォーマット バージョンに対して大きな loadData/closeData メソッドが発生します。

テキストベースのファイルは問題外です。なぜなら、それらは double 配列に対してあまりにも多くのスペースを使用するからです。

この問題を解決する良い方法を知っていますか? つまり、膨大な量のコードにならないように下位互換性のあるフォーマットを定義しますか? 任意の提案をいただければ幸いです。

私が考えているアイデアは、すべての変数をその変数を識別する整数でマークすることです。したがって、形式は[identifier1][variable1(String)][identifier2][variable2(double[][])]....

連載も考えましたが、経験がなく、それが正しい方法かどうかはわかりません。

データまたはいくつかの例に関する詳細情報が必要な場合は、コメントしてください。

4

4 に答える 4

2

http://code.google.com/p/protobuf/は、下位互換性が既に組み込まれている Google の優れたクロスプラットフォーム (およびクロス言語) のデータ保存方法です。試してみてください。

特に、ドキュメントのこの部分はあなたのケースに関係しています:

新しいフィールドは簡単に導入でき、データを検査する必要のない中間サーバーは、すべてのフィールドについて知る必要なく、単にデータを解析してデータを通過させることができました。

于 2012-08-03T14:34:24.017 に答える
1

を使用して問題が発生したことは一度もありませんSerialization。シリアライゼーションを使用する際に注意すべき点はほとんどありません。

/////-----------------------シリアライゼーションが失敗するのはいつですか----------------/////

-インスタンス変数が削除された場合。

インスタンス変数のデータ型を変更した場合。

-非静的インスタンス変数が静的インスタンス変数になるとき。

-非一時的なインスタンス変数が一時的なものになったとき。

-クラスが階層内で上下に移動したとき。

-シリアライズされたクラスが非シリアライズになった場合。

/////-----------------------シリアル化が影響を受けない場合----------------/////

インスタンス変数追加時。

インスタンス変数のアクセス指定子を変更した場合。

-一時的なインスタンス変数が非一​​時的なインスタンス変数に変換されるとき。

-クラスを追加または削除する場合。

于 2012-08-03T15:38:43.303 に答える
1

連載の道を歩むな…石と矛盾だらけです。データオブジェクトを変更すると、すべてが壊れます。Google protobuf は非常に優れたソリューションです。C ++で一度使用しました

ファイル形式の設定方法を理解するのは少し手間がかかりますが、それだけの価値があることは間違いありません。

于 2012-08-03T14:48:33.447 に答える