Javaでのシーケンス化


Javaでのシーケンス化
クラスをシーケンス化するにはjava.io.Serializableインタフェースを実装する必要があります.このインタフェースには何の方法もありませんが、前のcloneableインタフェースと同じです.このインタフェースが実装されると,このクラスがシーケンス化される能力を有することを示す.
一、まず、シーケンス化能力のあるクラスを実現しましょう.
import java.io.*; 
/** 
 *             
 * */
public class SerializableDemo implements Serializable{ 
    public SerializableDemo(){ 
          
    } 
    public SerializableDemo(String name, int age){ 
        this.name=name; 
        this.age=age; 
    } 
    @Override
    public String toString(){ 
        return "  :"+name+"    :"+age; 
    } 
    private String name; 
    private int age; 
}

 
二、ObjectOutputStreamを使用してシーケンス化された内容を出力する:
public class ObjectOutputStreamDemo{ 
    public static void main(String[] args) throws IOException{ 
        File file = new File("d:" + File.separator + "hello.txt"); 
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream( 
                file)); 
        oos.writeObject(new Person("rollen", 20)); 
        oos.close(); 
    } 
}

 
【運転結果】:
生成されたhello.txtを見ると、文字化けして見えますが、ほほほ.バイナリファイルなので.
 
三、ObjectInputStreamを使用してこのタイプを逆シーケンス化する.
import java.io.File; 
import java.io.FileInputStream; 
import java.io.ObjectInputStream; 
  
/** 
 * ObjectInputStream   
 * */
public class ObjectInputStreamDemo{ 
    public static void main(String[] args) throws Exception{ 
        File file = new File("d:" + File.separator + "hello.txt"); 
        ObjectInputStream input = new ObjectInputStream(new FileInputStream( 
                file)); 
        Object obj = input.readObject(); 
        input.close(); 
        System.out.println(obj); 
    } 
}

【運転結果】
名前:rollen  年齢:20
 
四、Externalizableインタフェースを使用してシーケンス化をカスタマイズする
Serializableインタフェースで宣言されたクラスのオブジェクトの属性はすべてシーケンス化されますが、シーケンス化されたコンテンツをカスタマイズする場合はExternalizableインタフェースを実装する必要があります.Externalizableインタフェースを使用して、シーケンス化されている属性ではなく、シーケンス化されている属性を制御します.
クラスがExternalizableというインタフェースを使用する場合、このクラスには無パラメータのコンストラクション関数が必要です.なければ、コンストラクション時に異常が発生します.これは、逆シーケンスの場合、無パラメータのコンストラクション関数がデフォルトで呼び出されるためです.
次に、シーケンス化と逆シーケンス化について説明します.
import java.io.*;    
import java.util.*;    
   
//    ???Externalizable    ?            
public class UserInfo implements Externalizable {    
    public String userName;    
    public String userPass;    
    public int userAge;    
   
    public UserInfo(){    
    }    
   
    public UserInfo(String username,String userpass,int userage){    
        this.userName=username;    
        this.userPass=userpass;    
        this.userAge=userage;    
    }    
        
    //    ? ?,?   ??     
    public void writeExternal(ObjectOutput out) throws IOException{    
        System.out.println("? ?      ");    
        //      ?     ?     
        Date d=new Date();    
        out.writeObject(d);    
        //    userName,userPass?     
        out.writeObject(userName);    
        out.writeObject(userPass);    
    }    
   
    //     ? ?,?   ??     
    public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{    
        System.out.println("? ?       ");    
        Date d=(Date)in.readObject();    
        System.out.println(d);    
        this.userName=(String)in.readObject();    
        this.userPass=(String)in.readObject();    
    }    
   
    public String toString(){    
        return " ? : "+this.userName+"; ?:"+this.userPass+    
            "; ?:"+this.userAge;    
    }    
}

テストクラス
import java.io.ObjectOutputStream;    
import java.io.ObjectInputStream;    
import java.io.FileInputStream;    
import java.io.FileOutputStream;    
import java.util.Date;    
import java.lang.management.*;    
public class Test {    
   
   
   
    //   ?        
    public static void serialize(String fileName){    
        try   
        {    
            //?   ? ?  ,?? ?        
            ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));    
   
            UserInfo user=new UserInfo("renyanwei","888888",20);    
            out.writeObject(user);  //      ??     
   
            out.close();    
        }    
        catch (Exception x)    
        {    
            System.out.println(x.toString());    
        }    
            
    }    
    //        ?     
    public static void deserialize(String fileName){    
        try   
        {    
            //?   ? ?  ,   ? ?     
            ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));    
   
            //? UserInfo?  ?   toString()      
            UserInfo user=(UserInfo)(in.readObject());              
            System.out.println(user.toString());    
   
            in.close();    
        }    
        catch (Exception x)    
        {    
            System.out.println(x.toString());    
        }    
            
    }    
   
    public static void main(String[] args) {        
   
        serialize("D:\\test.txt");    
        System.out.println("    ?");    
            
        deserialize("D:\\test.txt");    
        System.out.println("     ?");    
    }    
   
} 

【運転結果】:
シーケンス化メソッドのシーケンス化が完了しました逆シーケンス化メソッドThu Oct 23 22:18:12 CST 2008ユーザー名:renyanwei;パスワード:888888;年齢:0逆シーケンス化完了
 
五、transientを使用してシーケンス化の内容を制御する
Serializableインタフェースで実装する操作は、実は1つのオブジェクトのすべての属性をシーケンス化することであり、もちろんExternalizableインタフェースで一部の属性のシーケンス化を実現するために使用することもできますが、このような操作は面倒です.
Serializableインタフェースを使用してシーケンス化を実行する場合、オブジェクトの属性がシーケンス化されて保存されたくない場合は、transientキーワードを使用して説明します.
 
package IO; 
  
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
  
/** 
 *             
 * */
public class serDemo{ 
    public static void main(String[] args) throws Exception{ 
        ser(); //     
        dser(); //      
    } 
  
    public static void ser() throws Exception{ 
        File file = new File("d:" + File.separator + "hello.txt"); 
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream( 
                file)); 
        out.writeObject(new Person1("rollen", 20)); 
        out.close(); 
    } 
  
    public static void dser() throws Exception{ 
        File file = new File("d:" + File.separator + "hello.txt"); 
        ObjectInputStream input = new ObjectInputStream(new FileInputStream( 
                file)); 
        Object obj = input.readObject(); 
        input.close(); 
        System.out.println(obj); 
    } 
} 
  
class Person1 implements Serializable{ 
    public Person1(){ 
  
    } 
  
    public Person1(String name, int age){ 
        this.name = name; 
        this.age = age; 
    } 
  
    @Override
    public String toString(){ 
        return "  :" + name + "    :" + age; 
    } 
  
    //      
    private transient String name; 
    private int age; 
}

【運転結果】:
名前:null  年齢:20
 
六、配列のシーケンス化
 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
  
/** 
 *         
 * */
public class SerDemo1{ 
    public static void main(String[] args) throws Exception{ 
        Student[] stu = { new Student("hello", 20), new Student("world", 30), 
                new Student("rollen", 40) }; 
        ser(stu); 
        Object[] obj = dser(); 
        for(int i = 0; i < obj.length; ++i){ 
            Student s = (Student) obj[i]; 
            System.out.println(s); 
        } 
    } 
  
    //     
    public static void ser(Object[] obj) throws Exception{ 
        File file = new File("d:" + File.separator + "hello.txt"); 
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream( 
                file)); 
        out.writeObject(obj); 
        out.close(); 
    } 
  
    //      
    public static Object[] dser() throws Exception{ 
        File file = new File("d:" + File.separator + "hello.txt"); 
        ObjectInputStream input = new ObjectInputStream(new FileInputStream( 
                file)); 
        Object[] obj = (Object[]) input.readObject(); 
        input.close(); 
        return obj; 
    } 
} 
  
class Student implements Serializable{ 
    public Student(){ 
  
    } 
  
    public Student(String name, int age){ 
        this.name = name; 
        this.age = age; 
    } 
  
    @Override
    public String toString(){ 
        return "  :  " + name + "    :" + age; 
    } 
  
    private String name; 
    private int age; 
}

【運転結果】:
名前:  hello  年齢:20
名前:  world  年齢:30
名前:  rollen  年齢:40
 
七、タイプをXML形式にシーケンス化する
シーケンス化、逆シーケンス化XMLファイル、私はXStreamを使用してシーケンス化し、xstream-1.3.1.jarパッケージのサポートを導入する必要があります.http://xstream.codehaus.org/download.html  でjarをダウンロードし、Eclipseのbuild pathに導入できます.
public class Person implements Serializable{
    private String name;
    private int age;
    public Person(){
        
    }
    public Person(String str, int n){
        System.out.println("Inside Person's Constructor");
        name = str;
        age = n;
    }
    String getName(){
        return name;
    }
    int getAge(){
        return age;
    }
}

 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import com.thoughtworks.xstream.*;

public class Serialize {
    public static void main(String[] args) {
        Serialize ser = new Serialize();
        ser.serializeToXml();
        ser.deSerializeFromXml();
    }
    
public void serializeToXml(){
        Person[] myPerson = new Person[2];
        myPerson[0] = new Person("Jay",24);
        myPerson[1] = new Person("Tom",23);
        
        XStream xstream = new XStream();  
        try {
            FileOutputStream fos = new FileOutputStream("E:\\workspace\\2010_03\\src\\myPerson.xml");
             xstream.toXML(myPerson,fos);
             } catch (FileNotFoundException ex) {
             ex.printStackTrace();
             }       
        System.out.println(xstream.toXML(myPerson));
    }
    public void deSerializeFromXml(){
         XStream xs = new XStream();
         Person[] myPerson = null;

         try {
         FileInputStream fis = new FileInputStream("E:\\workspace\\2010_03\\src\\myPerson.xml");
         myPerson=(Person[])xs.fromXML(fis);
         if (myPerson != null)
         {
             int len = myPerson.length;
             for (int i=0;i<len;i++)
             {
                 System.out.println(myPerson[i].getName());
                 System.out.println(myPerson[i].getAge()); 
             }

         }
         } catch (FileNotFoundException ex) {
         ex.printStackTrace();
         }
    }
}

 
【運転結果】:
Inside Person's Constructor Inside Person's Constructor
Jay 24 Tom 23
 
出力されるXMLファイルは次のとおりです.
      Jay     24         Tom     23