Serializableインターフェースを実装した後にserialVersionUID値を指定する必要があるのはなぜですか?

シリアル化と逆シリアル化とは

通常の開発では、エンティティクラスがSerializableインターフェイスを実装しserialVersionUID、値を指定することが確実にわかります。このような

Serializableインターフェイスを実装する理由について質問がある場合があります。このインターフェイスは、シリアル化と逆シリアル化のために実装されています。

このエンティティクラスにメモリとハードディスク間のデータ相互作用がある場合、またはメモリとネットワーク間のデータ相互作用がある場合は、シリアル化と逆シリアル化が必要です。このとき、Serializableインターフェースが実装されていないjava.io.NotSerializableException例外が発生します

では、シリアル化と逆シリアル化とは何ですか?

「「

シリアル化:オブジェクトを一連のバイトに変換するプロセス

デシリアライズ:一連のバイトをオブジェクトに復元するプロセス

したがって、エンティティクラスを作成する場合、ハードディスクと対話する必要はありません。たとえば、このオブジェクトによってロードされたデータは、データベースに保存する必要はなく、ネットワークを介して送信する必要もありません(Kafka、Redisなどに送信するなど)。実装する必要はありませんSerializable

ご存知かどうかはわかりませんが、データ送信に通常使用するJSON形式は、実際にはオブジェクトを文字列に変換します。Stringソースコードを見てみましょう

StringSerializableインターフェイスを実装するだけでなくserialVersionUIDも指定します。

あなたは質問があるかもしれません、それは実装されましたSerializable、なぜあなたはserialVersionUIDを指定しなければならないのですか?

serialVersionUIDを指定する理由

エンティティクラスを定義する

例を見てみましょう。最初にエンティティクラスを記述します。

ここではserialVersionUID値を指定していません。どのような効果があるか見てみましょう。

書き方

1.エンティティカプセル化データをファイル(メモリ->ハードディスク)に書き込みます。これがシリアル化です。

2.ファイル内のデータをエンティティ(ハードディスク->メモリ)に変換します。これが逆シリアル化です。

テスト

試験結果

序列化前:UserInfo(name=Lvshen, hobby=看书)
反序列化后:UserInfo(name=Lvshen, hobby=看书)

データはメモリからファイルに正常に書き込まれ、ファイルから正常に読み取られました。

エンティティを変更する

このときUserInfo、新しいフィールド追加しますaddress

直接逆シリアル化

次に、シリアル化の方法をコメントアウトし、ファイルからデータを読み取ります

テスト結果は次のとおりです。

serialVersionUIDシリアル化された値が逆シリアル化された値とserialVersionUID矛盾していることがわかります原因となるInvalidClassException例外を。

最初に指定したとき

@Data
public class UserInfo implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;  //姓名
    private String hobby; //爱好
   
}

次に、上記のプロセス[シリアル化->逆シリアル化->エンティティの変更->逆シリアル化]を実行します。

序列化前:UserInfo(name=Lvshen, hobby=看书, address=null)
反序列化后:UserInfo(name=Lvshen, hobby=看书, address=null)

新しいaddressフィールドが追加されても、正常に逆シリアル化できることがわかります。

同じエンティティをシリアル化および逆シリアル化する場合serialVersionUID、成功するに値が一貫している必要あります。指定を表示しない場合はserialVersionUID、シリアル化中に自動的に生成されserialVersionUIDます。エンティティクラスが変更されて逆シリアル化されると、新しいクラスが生成されserialVersionUIDます。2つのserialVersionUID値は一貫していない必要があるため、逆シリアル化は失敗します。ただし、指定が表示されている場合、新しいserialVersionUIDは生成されませんデシリアル化serialVersionUIDは元のシリアルserialVersionUIDです。

実際の開発では、エンティティクラスは確実に繰り返し変更されるため、表示serialVersionUID値を指定することで、シリアル化や逆シリアル化を気にする必要がありません。

次の状況では必要ありませんserialVersionUID

「「
  • エンティティクラスの新しい属性がstatic変更された場合、この属性はシリアル化されません。

  • または、エンティティクラスの属性がtransient変更され、変更されたtransient値は影響を受けません(シリアル化されません)。

これらの2つのキーワードによって変更された属性をシリアル化する必要がある場合はどうすればよいかを考えることができますか?

過去に推奨

QRコードをスキャンして、よりエキサイティングになります。または、WeChatLvshen_9を検索すると、返信してバックグラウンドで情報を取得できます

1.回复"java" 获取java电子书;

2.回复"python"获取python电子书;

3.回复"算法"获取算法电子书;

4.回复"大数据"获取大数据电子书;

5.回复"spring"获取SpringBoot的学习视频。

6.回复"面试"获取一线大厂面试资料

7.回复"进阶之路"获取Java进阶之路的思维导图

8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

9.回复"总结"获取Java后端面试经验总结PDF版

10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

もう1つ:[マイベネフィット]をクリックして、さらに驚きを持ってください。

おすすめ

転載: blog.csdn.net/wujialv/article/details/108547358