JAVAシリアル化:Javaでのオブジェクトのシリアル化とは、オブジェクトを、オブジェクトのデータと情報を含むバイトシーケンスに変換することです。シリアル化されたオブジェクトは、データベースに書き込むことができます。ファイルはネットワーク送信にも使用できます。一般に、キャッシュを使用する場合(十分なメモリスペースがローカルにハードディスクに保存されない場合があります)、またはリモートでrpcを呼び出す場合(ネットワーク送信)、エンティティクラスにSerializableインターフェイスを実装させる必要があります。シリアル化できるようにするためだけに。
もちろん、シリアル化後の最終的な目標は、元のJavaオブジェクトを逆シリアル化して復元することです。したがって、シリアル化されたバイトシーケンスをJavaオブジェクトに復元でき、このプロセスは逆シリアル化です。
クラス内の一部のパラメーターが無意味にシリアル化されるシナリオがよくあります。シリアル化は、ディスクまたはネットワーク転送のサイズを増やすだけです。クラスには、パスワードなどの機密情報がいくつかあります。シリアル化後、セキュリティが低下します。クラスにシリアル化できないオブジェクトがあります。そして、このオブジェクトはフレームワークまたはシステムレベルから来ています。現時点では、transientキーワードを使用できます。部分的なシリアル化を実現します。トランジェントキーワードの主な機能は次のとおりです。オブジェクトがシリアル化されると(バイトシーケンスをターゲットファイルに書き込む)、トランジェントはインスタンスでこのキーワードで宣言された変数が永続化するのを防ぎます。オブジェクトがデシリアライズされると(ソースから)再構築のためのファイル読み取りバイトシーケンス)、そのようなインスタンス変数値は永続化および復元されません。
例:
Companyクラスは次のとおりです。
public class Company implements Serializable{
private String companyName;
private String companyAddress;
private String companyEmail;
private transient List<Employee> employees;
public Company(String companyName, String companyAddress, String companyEmail, List<Employee> employees) {
this.companyName = companyName;
this.companyAddress = companyAddress;
this.companyEmail = companyEmail;
this.employees = employees;
}
}
従業員クラスがあります
public class Employee implements Serializable{
private String Name;
private String phone;
public Employee(String name, String phone) {
Name = name;
this.phone = phone;
}
}
テスト方法:
public class TestSerializable {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
Employee employee1 = new Employee("张三","1234");
Employee employee2 = new Employee("张四","1234");
Employee employee3 = new Employee("张五","1234");
List<Employee> employees = new ArrayList();
employees.add(employee1);
employees.add(employee2);
employees.add(employee3);
Company company = new Company("百度","百度大厦","3333",employees);
ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("rectangle"));
// 往流写入对象
o.writeObject(company);
o.close();
System.out.println("反序列化之前的雇员" + company.getEmployees());
// 从流读取对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("rectangle"));
Company company1 = (Company)in.readObject();
System.out.println("反序列化之后的雇员" + company1.getEmployees());
}
}
EmployeeがSerializableを実装していないかどうかは誰もが知っています。この方法でCompanyをシリアル化すると、例外java.io.NotSerializableExceptionがスローされます。これは、Companyの変数Employeeをシリアル化できないためです。ただし、トランジェントを使用すると、部分的なシリアル化を実現できます。