1. Javaのシリアル化と逆シリアル化とは何ですか?
Javaシリアル化とは、Javaオブジェクトをバイトシーケンスに変換するプロセスを指し、Java逆シリアル化とは、バイトシーケンスをJavaオブジェクトに復元するプロセスを指します。
シリアル化:オブジェクトのシリアル化の主な用途は、オブジェクトを転送および保存するときに、オブジェクトの整合性と転送可能性を確保することです。シリアル化とは、オブジェクトを順序付けられたバイトストリームに変換して、ネットワーク経由で送信したり、ローカルファイルに保存したりすることです。コア機能は、オブジェクトの状態の保存と再構築です。
デシリアライズ:クライアントは、ファイルまたはネットワークからシリアル化されたオブジェクトのバイトストリームを取得し、バイトストリームに格納されているオブジェクトの状態と説明情報に従って、デシリアライズによってオブジェクトを再構築します。
2.なぜシリアル化と逆シリアル化が必要なのですか?
シリアル化がシリアル化の利点について話すことである理由、シリアル化の利点は何であるか、それで私たちはシリアル化する必要があります。
1つ:オブジェクトのシリアル化により、分散オブジェクトを実現できます。
メインアプリケーションは次のとおりです。RMI(つまり、Remote Method Invocation)は、オブジェクトがローカルマシンで実行される場合と同様に、オブジェクトのシリアル化を使用してリモートホストでサービスを実行します。
2:Javaオブジェクトのシリアル化は、オブジェクトのデータを保持するだけでなく、オブジェクトによって参照される各オブジェクトのデータを再帰的に保存します。
オブジェクト階層全体をバイトストリームに書き込んだり、ファイルに保存したり、ネットワーク接続を介して送信したりできます。オブジェクトのシリアル化は、オブジェクトの「ディープコピー」、つまり、オブジェクト自体と参照されるオブジェクト自体をコピーするために使用できます。オブジェクトをシリアル化すると、オブジェクトのシーケンス全体が取得される場合があります。
3:シリアル化により、メモリ内のクラスをファイルまたはデータベースに書き込むことができます。
例:特定のクラスをシリアル化してファイルとして保存し、次に読み取るときにファイル内のデータを逆シリアル化するだけで、元のクラスをメモリに復元できます。クラスをシリアル化して、送信用のストリーミングデータにすることもできます。
一般に、インスタンス化済みのクラスを保存用のファイルに変換します。次にインスタンス化する必要がある場合は、逆シリアル化してクラスをメモリにインスタンス化し、シリアル化中にクラス内のすべての変数と状態を保持します。
4:オブジェクト、ファイル、データ、さまざまな形式があり、送信とストレージを統合することは困難です。
シリアル化後はバイトストリームです。何でも同じものになり、共通の形式で送信または保存できます。送信が完了した後、再度使用する場合は、このように、オブジェクトはオブジェクトであり、ファイルはファイルです。
3.Javaのシリアル化と逆シリアル化を実装する方法
まず、シリアル化するクラスを準備し、Serializabelインターフェイスを実装する必要があります
例:Personクラスの名前と年齢をシリアル化する必要があります
import java.io.Serializable;
public class Person implements Serializable { //本类可以序列化
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "姓名:" + this.name + ",年龄" + this.age;
}
}
次に、名前と年齢をシリアル化します(つまり、これら2つのオブジェクトをバイナリに変換します。これは「スマッシング」として理解されます)。
package org.lxh.SerDemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class ObjectOutputStreamDemo { //序列化
public static void main(String[] args) throws Exception {
//序列化后生成指定文件路径
File file = new File("D:" + File.separator + "person.ser");
ObjectOutputStream oos = null;
//装饰流(流)
oos = new ObjectOutputStream(new FileOutputStream(file));
//实例化类
Person per = new Person("张三", 30);
oos.writeObject(per); //把类对象序列化
oos.close();
}
}