3

互換性のない変更を含む、シリアル化に関するいくつかのリスクがあります。シリアル化されるクラスで互換性のない変更が発生した場合、static finallongserialVersionUIDフィールドを使用しても逆シリアル化することはできません。

では、シリアル化の代替手段は何ですか?XML?代替案がある場合、実際のプロジェクトでシリアル化を使用することはありますか?

4

3 に答える 3

3

確かに、Java シリアライゼーションに代わるものがあります: XML (ご指摘のとおり)。JSON; プロトブフ; 代わりに使用したい他のもの。

それらはすべて、互換性のない変更のリスクを伴います。他の方法に魔法があるとは思いません。オブジェクトに新しい属性を追加する場合、「ダック タイピング」に対処する必要があります。必須の属性を削除すると、すべてのメソッドで問題が発生します。

于 2012-04-15T17:58:49.883 に答える
2

シリアル化とデータ形式を混同しているようです-おそらくそれらを分離するのが最善です。

シリアル化には、大まかに次の 3 種類があります。

  1. 自動化され、包括的で、低レベル- これはサービスとして提供でき、使用するのにほとんど労力を必要としないため便利です。ただし、その性質上、言語/プログラムで使用される内部形式に密接に関連しています。それが変更されると、逆シリアル化は「困難」になります。典型的な例は、java および python によって提供される「ネイティブ」シリアライゼーションです。プログラム状態の短期的なスナップショットに役立ちます。

  2. 自動化された、制限された、中レベル- 通常、通信/相互運用に使用されます。これは言語のすべての機能をサポートするわけではなく、おそらく単純なデータ構造のみを保存できます。それが十分であれば、それは自動化することができますが、言語の内部形式には依存しないため (ただし、必ずしもプログラムの詳細には依存しません)、便利な中間点です。典型的な例には、プロトコル バッファ、thrift、および json ライブラリが含まれます (データ形式である json 自体ではありません...)。明らかに、これは通信やアドホック データ ストアとして役立ちます。

  3. 「ハンドコーディング」、高レベル- これにはより多くの作業が必要であり、おそらく保存される情報は少なくなりますが、プログラム (または言語) で使用される内部形式に依存しない方法で「重要な部分」を抽出することを目的としています。例には、docbook やオープン ドキュメントが含まれます (jaxb は、デフォルトで close-to-(1) をサポートする点でかなり優れていますが、close-to-(3) は注意して許可します)。これは長期的なデータのアーカイブに役立ち、多くの場合「公式」仕様に関連付けられています。

上記とは別に、シリアル化されたデータをエンコードするために使用されるデータ形式があります。上記のすべてをxmlで実装できると確信しています。json は(2)で使用される傾向にあります。

とにかく、質問に答えるために-(1)あなたが指摘した問題があります。(2) で十分な場合、それは単純な解決策です (ただし、プログラム内のデータ構造が変更された場合、(1) の問題のいくつかに悩まされます)。それ以外の場合は、(3) で暗示された余分な作業を行う必要があります。

于 2012-04-15T23:32:36.300 に答える
1

答えは、目的によって異なります。Java プロセス間でデータを送信している場合、デフォルトの Java シリアライゼーション メカニズムは正常に機能する可能性があります。

ただし、データ、特に人間が見たり編集したりしたいデータを格納する場合、Java シリアライゼーション メカニズムはあまり適していません。

人間が読み取り可能/編集可能な出力が必要な場合に、私が非常に好む XML ベースの Java シリアライゼーション ライブラリが多数あります。

XStreamJAXBの 2 つが優れています。

于 2012-04-15T17:57:13.147 に答える