シリアル化は、オブジェクト定義を永続的な形式 (形式はプラットフォーム固有) に変換するプロセスです。ネットワーク (RMI、EJB) を介して転送されるオブジェクトは、シリアライズ可能である必要があります。SOAP リクエストは xml ベースであり、JAXB を使用してオブジェクト <---> xml をマーシャリングおよびアンマーシャリングします。コード品質プラグインから、SerialVersionUID を追加するように求められます。これは必須ですか?CXF/JAXB は内部的にこれを必要としますか?
2 に答える
私の知る限り、JAXBはそれを必要としません。クラスが を実装しているため、この警告が表示されますSerializable
が、JAXB ではクラスが である必要はありませんSerializable
。
クラスを にする必要がある理由が他にない場合Serializable
は、 を実装しないように変更できますSerializable
。
クラスを実装する必要がSerializable
あるのは、Java のデフォルトのシリアライゼーション メカニズム (RMI などで使用される) を使用してクラスをシリアライズ/デシリアライズできるようにする場合のみです。
SerialVersionUID を明示的に追加する必要があることについて、JAXB ドキュメントには言及されていません。
SerialVersionUID は、各 Serializable クラスによって保持されるバージョン番号です。これは、直列化がロードされるクラスに関する限り、直列化されたオブジェクトの送信側と受信側が互換性を維持していることを確認するために逆直列化で使用されます。
コンパイラは自分で SerialVersionUID を生成するので、心配する必要はないので、必要ありません。
計算はクラスの詳細に非常に適しているため、2 つの異なるコンパイラが異なる SerialVersionUID を計算できます。この場合、逆シリアル化プロセス中に JVN によって InvalidClassException がスローされる可能性があります。この場合、自分で SerialVersionUID を追加する必要があります。逆シリアル化の問題を回避するために、クラスを変更するたびに SerialVersionUID を変更する必要があります (これは、常に同じコンパイラを使用している場合は、SerialVersionUID を指定しないことをお勧めするためです)。
IDE の説明に惑わされないでください。これは、プロジェクトの開発要件に基づいて選択した決定です。