Javaプログレッシブとアンチプログレッシブ(Serialization)


一、何ですか?なぜ必要ですか?
プログレッシブ(Serialization)は、オブジェクトの状態情報を格納または転送できる形式に変換するプロセスであり、逆プログレッシブはその逆プロセスである。
メモリの揮発性転送の必要性いくつかのアプリケーションシーンでは、必要な時に読み込むためにオブジェクトを永続化する必要があります。
二、JDK提供のAPI
java.io.Object OutputStream類のwriteObject(Object Obj)方法
java.io.Object InputStream類のreadObject()方法
Serializableに対して、writeObjectとreadObjectを書き換えなければ、デフォルトの方法を呼び出します。
ExternalizableはSerializableを継承しています。もう2つの方法があります。writeExternalとreadExternalは、どのフィールドを並べ替えるべきかを制御します。
三、実現方法
Personクラスを仮定して、SerializableまたはExternalizableインターフェースを実現しました。

import java.io.Serializable;

/**
 * @Author: pf_xu
 * @Date: 2019/3/5 12:37
 * @Version 1.0
 */
public class Person implements Serializable {

 private int age;
 private String name;

 public Person(int age, String name) {
 this.age = age;
 this.name = name;
 }

 public void setAge(int age) {
 this.age = age;
 }

 public void setName(String name) {
 this.name = name;
 }

 public int getAge() {
 return age;
 }

 public String getName() {
 return name;
 }

}

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

/**
 * @Author: pf_xu
 * @Date: 2019/3/5 13:01
 * @Version 1.0
 */
public class SpecialPerson implements Externalizable {

 private int age;
 private String name;

 public SpecialPerson(){}

 public SpecialPerson(int age, String name) {
 this.age = age;
 this.name = name;
 }

 public void setAge(int age) {
 this.age = age;
 }

 public void setName(String name) {
 this.name = name;
 }

 public int getAge() {
 return age;
 }

 public String getName() {
 return name;
 }

 @Override
 public void writeExternal(ObjectOutput out) throws IOException {
 out.writeObject(age);
 out.writeObject(name);
 }

 @Override
 public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
 this.age = (Integer) in.readObject();
 this.name = (String)in.readObject();
 }
}

import java.io.*;

/**
 * @Author: pf_xu
 * @Date: 2019/3/5 12:40
 * @Version 1.0
 */
public class SerializableDemo {
 public static void main(String[] args) throws IOException, ClassNotFoundException {

 Person person = new Person(10,"Simon");
 ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream("object1.out"));
 oos1.writeObject(person);
 ObjectInputStream ois1= new ObjectInputStream(new FileInputStream("object1.out"));
 Person re_person = (Person) ois1.readObject();
 System.out.println(re_person.getName()+"---"+re_person.getAge());

 SpecialPerson specialPerson = new SpecialPerson(30,"Daniel");
 ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream("object2.out"));
 oos2.writeObject(specialPerson);
 ObjectInputStream ois2= new ObjectInputStream(new FileInputStream("object2.out"));
 SpecialPerson re_specialPerson = (SpecialPerson)ois2.readObject();
 System.out.println(re_specialPerson.getName()+"---"+re_specialPerson.getAge());

 }
}
  四、細かいところ
1.プログレッシブID
serialVersion UID  2つのクラスのIDが異なると、相互シーケンスと逆シーケンス(バージョン制御、異なるバージョンのクラスとの互換性、または互換性がない)ができません。
2.安全性
標準化により漏洩のリスクがある(バイナリ平文は暗号化の方法があります)
以上は小编が皆さんに绍介したJavaプログレッシブと反プログレッシブの详细な统合で、皆さんのために役に立つことを望んでいます。ここでも私たちのサイトを応援してくれてありがとうございます。