1

クライアント サーバー セットアップで、サーバーから送信されたオブジェクトのクラス定義を変更し、クライアント側でクラッシュすることが予想されました (クライアント jar はこれらの変更を反映するように更新されていません)。

ただし、クラッシュしません。

注: クライアントがオブジェクトを使用する方法によっては、クラッシュを回避できる場合があります。クライアントは、逆シリアル化されたオブジェクトをキャストしたり、削除されたフィールドを使用したりすることはありません。このオブジェクトは、Jython を介して Python スクリプトからのみ使用されます。Jython は、オブジェクトのフィールドを使用するときに、おそらく遅延バインディング メカニズム (リフレクション?) を採用しているため、物事が可能になります。これは、シリアライゼーションにクラスの署名が含まれていることも前提としていますが、これは true です (ObjectOutputStream のドキュメントで言及されています)。

また、serialVersionUid を変更することはありません。

私の推論は正しいように見えますか?

4

3 に答える 3

3

シリアライゼーションは、serialVersionUID を提供していない場合にのみ、クラス署名を使用してバージョン管理を生成します。提供しているため、クラス署名は使用されません。

変更されていないため、両方に互換性があると想定され、デフォルトの動作が実行されます

于 2012-05-18T14:35:59.783 に答える
1

serialVersionUIDクラスで使用している場合は、それを変更するのはあなた次第です。

そうしないと、Java はリフレクションに依存して、変更があった場合に例外をスローします。

于 2012-05-18T14:32:38.280 に答える
0

serialVersionUID が一致する限り、フィールドの削除は互換性のない変更ではありません。Object Serialization Specification の Object Versioning の章を参照してください。

于 2012-05-19T11:53:47.503 に答える