シリアル化と逆シリアル化とは
通常の開発では、エンティティクラスがSerializable
インターフェイスを実装しserialVersionUID
、値を指定することが確実にわかります。このような
Serializable
インターフェイスを実装する理由について質問がある場合があります。このインターフェイスは、シリアル化と逆シリアル化のために実装されています。
このエンティティクラスにメモリとハードディスク間のデータ相互作用がある場合、またはメモリとネットワーク間のデータ相互作用がある場合は、シリアル化と逆シリアル化が必要です。このとき、Serializable
インターフェースが実装されていないとjava.io.NotSerializableException
例外が発生します。
では、シリアル化と逆シリアル化とは何ですか?
「「シリアル化:オブジェクトを一連のバイトに変換するプロセス
デシリアライズ:一連のバイトをオブジェクトに復元するプロセス
」
したがって、エンティティクラスを作成する場合、ハードディスクと対話する必要はありません。たとえば、このオブジェクトによってロードされたデータは、データベースに保存する必要はなく、ネットワークを介して送信する必要もありません(Kafka、Redisなどに送信するなど)。実装する必要はありませんSerializable
。
ご存知かどうかはわかりませんが、データ送信に通常使用するJSON形式は、実際にはオブジェクトを文字列に変換します。String
ソースコードを見てみましょう
String
Serializable
インターフェイスを実装するだけでなく、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コードをスキャンして、よりエキサイティングになります。または、WeChatでLvshen_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つ:[マイベネフィット]をクリックして、さらに驚きを持ってください。