transient
日本語 | 一時的 |
英語 | transient |
ふりがな | とらんじえんと |
フリガナ | トランジエント |
直列化時に保存しないフィールドにつける予約語。
直列化(シリアライズ)されるクラスのフィールドにtransientを付けることで、そのフィールドはシリアライズしても保存されない。
保存されても意味がない場合に使用する。
直列化(シリアライズ)されるクラスのフィールドにtransientを付けることで、そのフィールドはシリアライズしても保存されない。
保存されても意味がない場合に使用する。
// 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 );
serializableData.setNotSavedData( 200 );
// 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() );
System.out.println( serializableData.getNotSavedData() );
// 200
// 0
// このように、transientフィールドは保存されません。
}
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 int data;
/**
* getter。
*/
public int getData()
{
return data;
}
/**
* setter。
*/
public void setData( int value )
{
this.data = value;
}
/**
* 保存されないtransientフィールド。
*/
private transient int notSavedData;
/**
* getter。
*/
public int getNotSavedData()
{
return notSavedData;
}
/**
* setter。
*/
public void setNotSavedData( int value )
{
this.notSavedData = value;
}
}
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 );
serializableData.setNotSavedData( 200 );
// 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() );
System.out.println( serializableData.getNotSavedData() );
// 200
// 0
// このように、transientフィールドは保存されません。
}
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 int data;
/**
* getter。
*/
public int getData()
{
return data;
}
/**
* setter。
*/
public void setData( int value )
{
this.data = value;
}
/**
* 保存されないtransientフィールド。
*/
private transient int notSavedData;
/**
* getter。
*/
public int getNotSavedData()
{
return notSavedData;
}
/**
* setter。
*/
public void setNotSavedData( int value )
{
this.notSavedData = 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 ); serializableData.setNotSavedData( 200 ); // 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() ); System.out.println( serializableData.getNotSavedData() ); // 200 // 0 // このように、transientフィールドは保存されません。 } 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 int data; /** * getter。 */ public int getData() { return data; } /** * setter。 */ public void setData( int value ) { this.data = value; } /** * 保存されないtransientフィールド。 */ private transient int notSavedData; /** * getter。 */ public int getNotSavedData() { return notSavedData; } /** * setter。 */ public void setNotSavedData( int value ) { this.notSavedData = value; } }