シリアル化フレームワーク(ARGなしコンストラクターなし)
-
30-09-2019 - |
質問
私は、以下(Java)に基づいてオブジェクトのグラフをシリアル化する最良のアプローチに関するいくつかの情報を探しています。
- 同じクラスの2つのオブジェクトは、状態が等しい場合、Trueと比較してバイナリ等しい(ビット)等しくなければなりません。 (JVMフィールドの注文に依存してはなりません)。
- コレクションは、配列でのみモデル化されています(コレクションはありません)。
- すべてのインスタンスは不変です
- シリアル化形式は、テキストベースではなくBYTE []形式である必要があります。
- 私はグラフ内のすべてのクラスを制御しています。
シリアル化をサポートするためだけに、クラスに空のコンストラクターを入れたくありません。私はObjenisisの私自身のトラバーサルに基づいたソリューションの実装を検討しましたが、私の問題はそれほどユニークではないようです。最初に既存/完全なソリューションをより適切に確認します。
更新された詳細:
まず、あなたの助けに感謝します!
- オブジェクトは、オブジェクト状態に基づいてまったく同じビット順序にシリアル化する必要があります。これは、バイナリコンテンツがデジタルで署名されるため重要です。シリアル化された形式の再構築は、オブジェクトの状態に基づいており、元のビットが保存されていることではありません。
- 異なるテクノロジー間の相互運用性が重要です。私はソフトウェアがExで実行されているのを見ます。将来.NET。シリアル化された形式にJavaフレーバーはありません。
不変性のコメントに関するメモ:配列の値は、構築装置の内側のフィールドに引数からコピーされます。あまり重要ではありません。
よろしくお願いします、
ニクラス・リンドバーグ
解決
たぶん、Javaが利用できるシリアル化フレームワークに慣れたいのかもしれません。そのための良い出発点はです Thift-Protobuf-Compare その名前が誤解を招くプロジェクト:Javaを使用してデータをシリアル化する10を超える方法のパフォーマンスを比較します。
あなたが持っている最も難しい制約はそうです Interoperability between different technologies
. 。グーグルのプロトバファーとリサイクルがここに配達されることを知っています。 Avroも合うかもしれません。
他のヒント
リフレクションまたはハンドコード化された方法を使用して、自分でデータを書き込むことができます。生成されていることを除いて、ハンドコードのように見えるメソッドを使用します。 (ハンドコード化されたパフォーマンス、およびコードが変更されたときに書き換えなければならないという条件)
多くの場合、開発者はビルトインJavaのシリアル化について話しますが、必要な方法で何でもするためのカスタムシリアル化を行うことができます。
あなたにもっと詳細な答えを与えるために、それはあなたが正確に何をしたいかによって異なります。
ところで:データをBYTE []にシリアル化することができますが、テキストエディターで/編集可能/編集可能/編集可能な人間のテキストになります。あなたがしなければならないのは、テキストのように見えるバイナリ形式を使用することです。 ;)
シリアル化について知っておくべき重要なことは、Javaの複数のバージョンで一貫性があることが保証されていないことです。それは、ディスクまたは永続的な場所にデータを保存する方法としてではありません。
RMIまたは他のネットワークプロトコル中に、あるJVMから別のJVMにクラスを送信するために内部で使用されています。これらは、シリアル化を使用する必要があるアプリケーションの種類です。これがあなたの問題を説明している場合 - 2つの異なるJVM間の短期通信 - は、シリアル化を進めてみてください。
データをより永続的に保存する方法を探している場合、またはJavaのフォワードバージョンで生存するためにデータを必要とする場合は、独自のソリューションを見つける必要があります。要件を考慮して、各オブジェクトをバイトストリーミングに変換し、それをオブジェクトに読み戻すためのある種の方法を作成する必要があります。次に、フォーマットが将来のオブジェクトや機能と互換性があることを確認する責任があります。
の第11章を強くお勧めします 効果的なJava ジョシュア・ブロッホ著。
外部化可能なインターフェイスはあなたが探しているものですか?オブジェクトが持続する方法を完全に制御し、OOスタイルを行います。これは、継承されたメソッドとすべてを使用して(シリアル化可能で使用されるプライベート読み取り/書き込みオブジェクトメソッドとは異なります)。それでも、ARGアクセス可能なコンストラクターの要件を取り除くことはできません。
これを取得する唯一の方法は、A/ UTF8テキスト、IE XMLまたはJSONを使用することです。バイナリはbase64(HTTP/ XML安全な種類)に変わります。 b/すべてのデータのUTF8バイナリ順序を強制します。 c/すべての無効な空白を除く内容を詰めます。 d/ hashコンテンツをハッシュし、ファイル内の位置的に標準的な場所でそのハッシュを提供します。