シーケンシャル理解

5517 ワード

Javaシーケンス化
 
Javaは、オブジェクトのデータ、オブジェクトに関するクラスの情報、およびオブジェクトに格納されたデータのタイプを含むバイトシーケンスとして表すことができるオブジェクトシーケンス化メカニズムを提供する.
シーケンス化されたオブジェクトをファイルに書き込むと、ファイルから読み出して逆シーケンス化できます.つまり、オブジェクトのタイプ情報、オブジェクトのデータ、およびオブジェクトのデータ型がメモリに新しいオブジェクトを作成するために使用できます.
プロセス全体は、JAVA仮想マシン(JVM)によって独立しています.つまり、あるプラットフォーム上でシーケンス化されたオブジェクトは、JAVA仮想マシンがプラットフォームにまたがっているため、別の全く異なるプラットフォーム上で逆シーケンス化することができます.
 
クラスObjectInputStreamとObjectOutputStreamは、シーケンス化と逆シーケンス化の方法を含む最上位レベルのデータストリームです.
ObjectOutputStreamクラスには、さまざまなデータ型を書くための多くの書き込み方法が含まれていますが、特別な方法の例外です.
writeObject(Object x)メソッド:
public final void writeObject(Object x) throws IOException

上記の方法では、オブジェクトをシーケンス化し、出力ストリームに送信します.同様のObjectInputStreamクラスには、次のようにオブジェクトを逆シーケンス化する方法があります.
readObject()メソッド:
public final Object readObject() throws IOException,CalssNotFoundException

このメソッドは、ストリームから次のオブジェクトを取り出し、オブジェクトを逆シーケンス化します.戻り値はObjectなので、使用するデータ型に変換する必要があります.
オブジェクトがシーケンス化できるかどうかを判断するにはどうすればいいですか?
オブジェクトがシーケンス可能である場合、次の2つの条件が満たされます.
1.オブジェクトをインスタンス化するクラスはjavaを実装する必要がある.io.Serializableインタフェース
2.オブジェクトをインスタンス化するクラスのすべての属性はシーケンス可能であり、シーケンス不可能な属性がある場合は、その属性が短いことを明記する必要があります.たとえば、次のようにします.
public transient int SSN = 112;

この属性SSNはシーケンス化不可能であり、シーケンス化時にその属性の値が出力ストリームに伝達されず、逆シーケンス化時には値112が取り出せないことを説明する.
 
クラスがSerializableインタフェースを実装し、シーケンス化できるのはなぜですか?ObjectOutputStreamを使用してオブジェクトを永続化する場合、クラスには次のコードがあります.
private void writeObject0(Object obj, boolean unshared) throws IOException {
  ...
    if (obj instanceof String) { 
        writeString((String) obj, unshared);
    } else if (cl.isArray()) { 
        writeArray(obj, desc, unshared);
    } else if (obj instanceof Enum) {
        writeEnum((Enum) obj, desc, unshared);
    } else if (obj instanceof Serializable) {
        writeOrdinaryObject(obj, desc, unshared);
    } else {
        if (extendedDebugInfo) {
        throw new NotSerializableException(cl.getName() + "
" + debugInfoStack.toString()); } else { throw new NotSerializableException(cl.getName()); } } ...}

上記のコードから分かるように、書き込み対象オブジェクトのタイプがString、配列、Enum、またはSerializableであれば、そのオブジェクトをシーケンス化することができ、そうでなければNotSerializableException異常を投げ出すことになる.
 
 
JAvaにおけるシーケンス化の意味
シーケンス化については、永続化と呼ばれ、オブジェクトをディスクに書き込むことがよくあります.
さらに、符号化ルールについては、
いずれかのエンティティークラスは、Serializableインタフェースを実装する必要があります.後でクラスを永続化したり、ネットワーク転送のためにバイト配列に変換したりすることができます.
エンティティクラスの場合、すべてのプロパティをシーケンス化したくない場合は、キーワードtransientでプロパティを修飾できます.
private transient String name

クラスをシーケンス化すると、transientキーワードで修飾されたプロパティは自動的に無視されます.
 
例:Serializableインタフェースを実装するEmployeeクラスをシーケンス化
 
 
Employee.JAvaファイルコード:
public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + name + " " + address);
   }
}

 
 
シーケンス化クラスEmployeeオブジェクト
新しいSerializeDemo.JAvaファイルは、プログラムが実行するとemployeeが作成されます.serファイル.
注意:オブジェクトをファイルにシーケンス化する場合、Javaの標準規則に従ってファイルを1つ与える.ser拡張子.
import java.io.*;

public class SerializeDemo
{
    public static void main(String [] args)
    {
        Employee e = new Employee();
        e.name = "Reyan Ali";
        e.address = "Phokka Kuan, Ambehta Peer";
        e.SSN = 11122333;
        e.number = 101;
        try
        {
            FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
            ObjectOutputStream out = ObjectOutputStream(fileOut);
            out.writeObject(e);
            out.close();
            fileOut.close();
            System.out.printf("Serialized data is saved in /tmp/employee.ser");
        }catch(IOException i)
        {
            i.printStackTrace();
        }
   }
}

 
 
逆シーケンス化オブジェクト
次のDeserializeDemoプログラムは逆シーケンス化を実現した,/tmp/employee.serはEmployeeオブジェクトを格納します.
import java.io.*;

public class DeserializeDemo
{
    public static void main(String [] args)
    {
        Employee e = null;
        try
        {
            FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            e = (Employee) in.readObject();
            in.close();
            fileIn.close();
        }catch(IOException i)
        {
            i.printStackTrace();
            return;
        }catch(ClassNotFoundException c)
        {
            System.out.println("Employee class not found");
            c.printStackTrace();
            return;
        }
        System.out.println("Deserialized Employee...");
        System.out.println("Name: " + e.name);
        System.out.println("Address: " + e.address);
        System.out.println("SSN: " + e.SSN);
        System.out.println("Number: " + e.number);
    }
}

以上のプログラムのコンパイル実行結果は以下の通りです.
Deserialized Employee...
Name: Reyan Ali
Address:Phokka Kuan, Ambehta Peer
SSN: 0
Number:101

注意:1、JVMの逆シーケンス化オブジェクトでは、バイトコードのクラスを見つける必要があります.JVMが逆シーケンス化されたオブジェクトでクラスが見つからない場合、ClassNotFoundException例外が放出されます.
2.readObject()メソッドの戻り値がObjectタイプのオブジェクトは、使用するタイプに変換する必要があります.
3.SSNはシーケンス化できないため、逆シーケンス化時にその値が見つからない.