Serializableの使用

7423 ワード

今回の解説ではJavaのプロジェクトを作って、序列化されたSerializableの使用、序列化された原理及び順序化されたカスタマイズを体験してみます。私のもう一つのブログ(java高級-->Serializableの序盤化されたソース分析を参照してください。)
ディレクトリナビゲータ
Serializableプログレッシブの簡単な説明SerializableプログレッシブコードインスタンスExternalizableプログレッシブコードインスタンス友情リンク
Serializable序列化の簡単な説明一、持久化の簡単な紹介:
「持続化」とは、オブジェクトの「生存時間」が、プログラムが実行されているかどうかに依存しないことを意味します。すなわち、プログラムの各呼び出しの間に存在または「生存」があります。オブジェクトをプログレッシブ化してディスクに書き込み、プログラムを再起動したときにそのオブジェクトを復元すると、永続効果が円満に実現されます。
二、言語には対象の順序化の概念が追加された後、二つの主要な特性に対するサポートが提供されます。
リモートメソッド呼び出し(RMI)は、元々他のマシンに存在していたオブジェクトを、ローカルマシン上にあるような動作にすることができます。メッセージをリモートオブジェクトに送るには、パラメータと戻り値をオブジェクトのプログレッシブによって転送する必要があります。Java Beanを使用する場合、その状態情報は通常設計の間に配置されます。プログラムが起動したら、この状態情報を保存して、プログラムが起動したら回復します。具体的な仕事は対象者が順次完成する。
三、Serializableのいくつかの説明:
オブジェクトのプログレッシブ処理は非常に簡単であり、オブジェクトのみがSerializableインターフェースを実現すればよく、プログレッシブの対象は基本的なデータタイプ、すべてのクラスおよび他の多くのものを含み、また、Classオブジェクトのプログレッシブ化は対象の「パノラママップ」だけを保存しない。また、対象内に含まれているすべてのハンドルを追跡し、それらのオブジェクトを保存することができます。次に、各オブジェクト内に含まれるハンドルに対して、tranientキーを使って修飾された変数を追跡することができ、プログレッシブオブジェクトの過程では、この属性はプログレッシブ化されない。
四、順序化のステップ:
まず、いくつかのOutputStreamオブジェクトを作成します。Output Stream=new FileOutputStream(「output.txt」)はObject OutputStreamオブジェクト内にカプセル化します。その後はwriteObject()を呼び出すだけで、オブジェクトの順序付けが完了し、OutputStream:object Output Stream.writeObject(Object);最後に資源を閉じることを忘れないでください。Object OutputStream.close()、outputStream.close()
五、反秩序化のステップ:
まず、いくつかのOutputStreamオブジェクトを作成します。Input Stream=new FileInputStream(「output.txt」)はObject InputStreamオブジェクト内にカプセル化します。Object InputStream=new Object Input Stream=new ObjectInput Stream。その後はwriteObject()を呼び出すだけで、オブジェクトの逆順序化ができます。object InputStream.readObject()最後に、リソースを閉じることを忘れないでください。object InputStream.close()、inputStream.close()
Serializableのプログレッシブなコードの実例プロジェクトの構造は以下の通りです。ソースコードのダウンロードはhhhx友情リンクを参照してください。
まず、私達はManクラスを創立して、Serializableインターフェースを実現しました。Person類のテストに使います。
package comp.hx.model;import java.io.Serializable;
public class Man implemens Serializable{prvate static final long serialVerssionUID=1 L;
private String username;
private String password;

public Man(String username, String password) {
    this.username = username;
    this.password = password;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}
)
二、私達はもう一つのPerson類を創立して、序列化に使います。
package comp.hx.model;import java.io.Serializable;
public class Person implemens Serializable{prvate static final long serialVerssionUID=1 L;
private Man man;
private String username;
private transient int age;

public Person() {
    System.out.println("person constru");
}

public Person(Man man, String username, int age) {
    this.man = man;
    this.username = username;
    this.age = age;
}

public Man getMan() {
    return man;
}
public void setMan(Man man) {
    this.man = man;
}
public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
)
三、メーンメソッドを含むテストクラスを作成する:MainTest、そのwriteSerializable Objectは、プログレッシブオブジェクトに使用される:
/Serializablblblblblblblic static void writeSerializablblbleObject(){try{Man man=new Man Man Man(「hx」、「1234556」);Person person=new Person(man、「劉力」、21);ObjectoOutputSteputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputeputezzzzzzzauteputeputeputOutputStream.writeObject(「string」);object OutputStream.writeObject;object Output Stream.close();catch(FileNotFoundException){e.print StockTrace)}catch(IOException){e.print StockTrace}
四、テストクラスのMainTest、そのreadSerializable Objectは、アンチプログレッシブオブジェクトに使用されます。
/Serializablblblblblblblblblblblble:反プロプログレ対象pblic static voidreadSerializablblblbleObject(){try{ObjecInputStream abjecInputStream=new ObjecInputStream(new FileInputStream Stream(「out.Stream.Stream))))=ststream[stream=stststream=ststream=ststream=stream=stream=stream=stream=stririring stream=stream======readObject();object InputStream.close();System.out.println(string+“、age:”+person.getAge()+“、man username:”+person.getMan().getUsername();}catch(FileNotFoundException){e.print StockTrace;
五、Mainメソッドに上記の二つの方法を追加して実行した結果、次のようになりました。
PersonクラスにはManの引用が含まれています。Personがプログレッシブされたとき、ManもプログレッシブされたwriteObject方法でStringに入ることができたのはStringが最初にクラスであり、次にSerialzableインターフェースを実現したPersonクラスのageフィールドがtranientであることが分かります。「劉力」、21)対象の場合は、ageはプログレッシブされていません。tranientで修飾されたObjectタイプの場合、印刷の結果はnullとなります。
Externalizableは、まず、Externalizableの定義を見ます。Serializableインターフェースを継承しました。
public interface Externalizable extens java.io.Serializable 1、同じ私達は先にExternalizableを実現したUser類を作成します。中の二つの方法を書き直します。readExternalとwriteExternal。
package comp.hx.model;
import java.io.Externalizable;import java.io.IOExceptio;import java.io.Object Input;import java.io.Object Output;
public class User implement s Externalizable{privte String user}
public String getUser() {
    return user;
}

public int getAge() {
    return age;
}

private int age;

public User() {
    System.out.println("user constructor.");
}

public User(String user, int age) {
    System.out.println("user constructor two.");
    this.user = user;
    this.age = age;
}

@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    System.out.println("read external.");
    user = (String) in.readObject();
    age = in.readInt();
}

@Override
public void writeExternal(ObjectOutput out) throws IOException {
    System.out.println("write external.");
    out.writeObject(user);
    out.writeInt(age);
}
)
二、MainTestに方法writeExternalizable Objectを加入し、序列化対象Userに使用する。
/Externalizableの序列化対象public static voidwriteExternalizablbleObject(){User=new User("hx",22);try{Object OutututututututStutututStream=new ObjectObjectObject Outject Stream Stream==new ObjectObjectject Outject Outject Outject OututututututututututeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeputOputOpututctOutputStream.close();catch(FileNotFoundException e){e.print StockTrace()}catch(IOException e){e.print StockTrace()}
三、MainTestに方法writeExternalizable Objectを加入して、逆順序化対象Userに使用する。
/Externalizableのアンチプロプロプログレオブジェクトpublic static void readExternalizablebleObject(){try{ObjecInputStream ojecInputStream=new ObjecInputStream(new FileInputStream Stream(「ExternalizatStream Stream)==========""""""""""""==========="""""""""""""""""""""""""""""""""""""""""""""""""out.println(「name:」+user.getUser()+「age:」+user.getAge();}catch(FileNotFoundException e){e.print StockTrace();}catch(Exception){e.print StockTrace();}
四、Mainメソッドに上記の二つの方法を追加して実行した結果、次のようになりました。
まずUser user=new User("hux",22);Userを実行した参構造関数は、writeObject(user)に実行される。;方法は、UserがExternalizableインターフェースを実現したため、そのwriteExternalが実行し、UserにおけるreadExternal方法でObject InputのreadObject方法を呼び出し、この方法では反射機構によりUserのインスタンスを作成し、Userの無参画関数を呼び出した。そして、Oadjectの場合も同様に、Extrajectメソッドを実行する。方法です。これは後のソースコード分析の時に言います。