JavaA2Z

KAB-studio > プログラミング > JavaA2Z > 直列化とは

直列化

日本語 連載化、連続化
英語 serialize、serialization
ふりがな ちょくれつか
フリガナ チョクレツカ

解説

特定のデータを保存すること。
クラス等のデータをファイル等に保存することを「直列化する」と言い、また、保存することができるクラスを「直列化可能なクラス」と呼ぶ。
「直列化」のことを「シリアライズ」とも言う。
 
ファイル等に保存すると言っても、ストリームを用いてフィールド単位で保存することを「直列化する」とは言わない。
直列化は主に「クラスまるごと一度に保存」する場合を指す。またこの場合、直列化可能なクラスSerializableインターフェイス実装クラスとする必要がある。
 
「直列化」とは非常に耳慣れない言葉のため、イメージが作りにくい。
元々の英語は「serialize」もしくは「serialization」であり、日本語訳としては「連載化」「連続化」の方が解りやすい。
いずれにせよ、直列化のイメージは「ひとつのものが続いていく」というものである。
クラスの情報は、アプリケーションが終了すれば消えてしまうため、次回の実時に持ち越すことはできない。つまりこの場合、クラスの情報は「続けて存在しない」ことになる。
だが、クラスの情報をファイルに保存し、次回実時に読み込めば、クラスの情報を持ち越すことができる、つまり「インスタンスが続けて存在する」ことになる。
この「クラスの情報が続いていく」ということが「クラスの直列化」の真の意味である。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
import java.io.Serializable;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;

public class Sample
{
    public static void main( String[] args )
    {
        // 出力ファイルの絶対パス。
        // ファイルは存在しなくても構いません。
        // というか存在すると上書きされます。
        String filePath = "D:/Sample/serializable.data";

        // 出力します。

        // FileOutputStreamクラスの参照型変数。
        // ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
        FileOutputStream fileOutputStream = null;
        try
        {
            // 書き込むデータを作ります。
            SerializableData serializableData = new SerializableData();
            serializableData.setData( 100 );

            // FileOutputStreamクラスを作ります。
            // ファイル出力用のストリームです。
            fileOutputStream = new FileOutputStream( filePath );
            // そのストリームを使って直列化可能なオブジェクトを
            // 書き込むクラスObjectOutputStreamクラスを作ります。
            ObjectOutputStream objectOutputStream = new ObjectOutputStream( fileOutputStream );

            // データを書き込みます。
            // ここで渡すクラスは「Serializableインターフェイスの実装クラス」
            // である必要があります。
            objectOutputStream.writeObject( serializableData );
            objectOutputStream.flush();
        }
        catch( IOException e )
        {
            // ファイルが無かった場合等に、この
            // IOException例外が投げられます。
            e.printStackTrace();
            return;
        }
        finally
        {
            // ファイルを扱ったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。close()メソッドを呼ぶのは
            // FileOutputStreamだけです。
            try
            {
                if( fileOutputStream != null )
                {
                    fileOutputStream.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }

        // 入力します。

        // FileOutputStreamクラスの参照型変数。
        // ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
        FileInputStream fileInputStream = null;
        try
        {
            // 今書き込んだデータを取り出します。
            // FileInputStreamクラスを作ります。
            // ファイル入力用のストリームです。
            fileInputStream = new FileInputStream( filePath );
            // そのストリームを使って、直列化可能なオブジェクトを
            // 読み込むクラスObjectInputStreamクラスを作ります。
            ObjectInputStream objectInputStream = new ObjectInputStream( fileInputStream );
            
            // データを取り出します。
            SerializableData serializableData = (SerializableData)objectInputStream.readObject();
            System.out.println( serializableData.getData() );
        }
        catch( IOException e )
        {
            // ファイルが無かった場合等に、この
            // IOException例外が投げられます。
            e.printStackTrace();
            return;
        }
        catch( ClassNotFoundException e )
        {
            // ObjectInputStream#readObject()メソッドがthrows指定している
            // ClassNotFoundException例外を受け取ります。
            e.printStackTrace();
            return;
        }
        finally
        {
            // ファイルを扱ったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。close()メソッドを呼ぶのは
            // FileInputStreamだけです。
            try
            {
                if( fileInputStream != null )
                {
                    fileInputStream.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }
    }
}

/**
*   保存用データクラス。
*   Serializableインターフェイスの実装クラスです。
*/
class SerializableData implements Serializable
{
    /**
    *    privateなフィールド。
    */
    private int data;

    /**
    *    getter。
    */
    public int getData()
    {
        return data;
    }

    /**
    *    setter。
    */
    public void setData( int value )
    {
        this.data = value;
    }
}
// Sample.java
import java.io.Serializable;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;

public class Sample
{
    public static void main( String[] args )
    {
        // 出力ファイルの絶対パス。
        // ファイルは存在しなくても構いません。
        // というか存在すると上書きされます。
        String filePath = "D:/Sample/serializable.data";

        // 出力します。

        // FileOutputStreamクラスの参照型変数。
        // ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
        FileOutputStream fileOutputStream = null;
        try
        {
            // 書き込むデータを作ります。
            SerializableData serializableData = new SerializableData();
            serializableData.setData( 100 );

            // FileOutputStreamクラスを作ります。
            // ファイル出力用のストリームです。
            fileOutputStream = new FileOutputStream( filePath );
            // そのストリームを使って直列化可能なオブジェクトを
            // 書き込むクラスObjectOutputStreamクラスを作ります。
            ObjectOutputStream objectOutputStream = new ObjectOutputStream( fileOutputStream );

            // データを書き込みます。
            // ここで渡すクラスは「Serializableインターフェイスの実装クラス」
            // である必要があります。
            objectOutputStream.writeObject( serializableData );
            objectOutputStream.flush();
        }
        catch( IOException e )
        {
            // ファイルが無かった場合等に、この
            // IOException例外が投げられます。
            e.printStackTrace();
            return;
        }
        finally
        {
            // ファイルを扱ったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。close()メソッドを呼ぶのは
            // FileOutputStreamだけです。
            try
            {
                if( fileOutputStream != null )
                {
                    fileOutputStream.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }

        // 入力します。

        // FileOutputStreamクラスの参照型変数。
        // ここで作っておくのはfinallyでclose()メソッドを呼ぶためです。
        FileInputStream fileInputStream = null;
        try
        {
            // 今書き込んだデータを取り出します。
            // FileInputStreamクラスを作ります。
            // ファイル入力用のストリームです。
            fileInputStream = new FileInputStream( filePath );
            // そのストリームを使って、直列化可能なオブジェクトを
            // 読み込むクラスObjectInputStreamクラスを作ります。
            ObjectInputStream objectInputStream = new ObjectInputStream( fileInputStream );
            
            // データを取り出します。
            SerializableData serializableData = (SerializableData)objectInputStream.readObject();
            System.out.println( serializableData.getData() );
        }
        catch( IOException e )
        {
            // ファイルが無かった場合等に、この
            // IOException例外が投げられます。
            e.printStackTrace();
            return;
        }
        catch( ClassNotFoundException e )
        {
            // ObjectInputStream#readObject()メソッドがthrows指定している
            // ClassNotFoundException例外を受け取ります。
            e.printStackTrace();
            return;
        }
        finally
        {
            // ファイルを扱ったら、最後にclose()メソッドを呼んで
            // 後処理をします。また、これは必ず行うため、
            // finally内で行います。close()メソッドを呼ぶのは
            // FileInputStreamだけです。
            try
            {
                if( fileInputStream != null )
                {
                    fileInputStream.close();
                }
            }
            catch( IOException e )
            {
                // close()メソッドはIOExceptionがthrows指定されているので
                // 一応受け取ります。
                e.printStackTrace();
            }
        }
    }
}

/**
*   保存用データクラス。
*   Serializableインターフェイスの実装クラスです。
*/
class SerializableData implements Serializable
{
    /**
    *    privateなフィールド。
    */
    private int data;

    /**
    *    getter。
    */
    public int getData()
    {
        return data;
    }

    /**
    *    setter。
    */
    public void setData( int value )
    {
        this.data = value;
    }
}

この単語を含むページ

「みだし」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/07/01
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。