「オブジェクトのシリアル化」とはどういう意味ですか? いくつか例を挙げて説明していただけますか?
15 に答える
シリアル化とは、オブジェクトを一連のバイトに変換することです。これにより、オブジェクトを永続ストレージに簡単に保存したり、通信リンクを介してストリーミングしたりできます。次に、バイト ストリームを逆シリアル化 (元のオブジェクトのレプリカに変換) できます。
シリアライゼーションは、オブジェクト インスタンスを一連のバイトに変換するプロセスと考えることができます (実装によっては、バイナリであるかどうかに関係なく)。
たとえば、ある JVM から別の JVM に、ネットワークを介して 1 つのオブジェクト データを送信する場合に非常に便利です。
Java では、シリアライゼーション メカニズムがプラットフォームに組み込まれていますが、オブジェクトをシリアライズ可能にするには、 Serializableインターフェイスを実装する必要があります。
また、属性をtransientとしてマークすることで、オブジェクト内の一部のデータがシリアル化されないようにすることもできます。
最後に、デフォルトのメカニズムをオーバーライドして、独自のものを提供できます。これは、いくつかの特別な場合に適している場合があります。これを行うには、 java の隠し機能の 1 つを使用します。
シリアル化されるのはオブジェクトの「値」またはコンテンツであり、クラス定義ではないことに注意してください。したがって、メソッドはシリアル化されません。
以下は、読みやすくするためのコメント付きの非常に基本的なサンプルです。
import java.io.*;
import java.util.*;
// This class implements "Serializable" to let the system know
// it's ok to do it. You as programmer are aware of that.
public class SerializationSample implements Serializable {
// These attributes conform the "value" of the object.
// These two will be serialized;
private String aString = "The value of that string";
private int someInteger = 0;
// But this won't since it is marked as transient.
private transient List<File> unInterestingLongLongList;
// Main method to test.
public static void main( String [] args ) throws IOException {
// Create a sample object, that contains the default values.
SerializationSample instance = new SerializationSample();
// The "ObjectOutputStream" class has the default
// definition to serialize an object.
ObjectOutputStream oos = new ObjectOutputStream(
// By using "FileOutputStream" we will
// Write it to a File in the file system
// It could have been a Socket to another
// machine, a database, an in memory array, etc.
new FileOutputStream(new File("o.ser")));
// do the magic
oos.writeObject( instance );
// close the writing.
oos.close();
}
}
このプログラムを実行すると、ファイル「o.ser」が作成され、その背後で何が起こったかを確認できます。
someIntegerの値を、たとえばInteger.MAX_VALUEに変更すると、出力を比較して違いを確認できます。
その違いを正確に示すスクリーンショットを次に示します。
違いがわかりますか?;)
Javaシリアライゼーションには追加の関連フィールドがあります:serialversionUIDですが、これはすでに長すぎてカバーできません。
シリアライゼーションは、メモリ内の「ライブ」オブジェクトを取得し、それをどこかに保存できる形式に変換し (メモリ内、ディスク上など)、後で「デシリアライズ」してライブ オブジェクトに戻します。
@OscarRyz のやり方が気に入りました。ここでは、@amitgupta によって書かれた連載の話を続けています。
ロボットのクラス構造について知っていて、データをシリアライズしたにもかかわらず、地球の科学者は、ロボットを機能させるデータをデシリアライズすることができませんでした。
Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:
火星の科学者たちは全額の支払いを待っていました。支払いが完了すると、火星の科学者はserialversionUIDを地球の科学者と共有しました。地球の科学者はそれをロボットクラスに設定し、すべてがうまくいった.
シリアライゼーションとは、Java でオブジェクトを永続化することを意味します。オブジェクトの状態を保存し、後で状態を再構築したい場合 (別の JVM にある可能性があります)、シリアライゼーションを使用できます。
オブジェクトのプロパティのみが保存されることに注意してください。オブジェクトを再び復活させたい場合は、メンバー関数ではなくメンバー変数のみが保存されるため、クラスファイルが必要です。
例えば:
ObjectInputStream oos = new ObjectInputStream(
new FileInputStream( new File("o.ser")) ) ;
SerializationSample SS = (SearializationSample) oos.readObject();
Serializable は、クラスがシリアライズ可能であることを示すマーカー インターフェースです。マーカー インターフェイスは、それが単なる空のインターフェイスであることを意味し、そのインターフェイスを使用すると、このクラスをシリアライズ可能にできることが JVM に通知されます。
シリアル化とは、オブジェクトの状態をビットに変換して、ハード ドライブに保存できるようにするプロセスです。同じオブジェクトを逆シリアル化すると、後でその状態が保持されます。オブジェクトのプロパティを手動で保存しなくても、オブジェクトを再作成できます。
シリアル化は、オブジェクトをストレージメディア(ファイルやメモリバッファなど)に保存するプロセス、またはネットワーク接続を介してバイナリ形式でオブジェクトを送信するプロセスです。シリアル化されたオブジェクトはJVMに依存せず、任意のJVMで再シリアル化できます。この場合、「メモリ内」のJavaオブジェクトの状態はバイトストリームに変換されます。このタイプのファイルは、ユーザーには理解できません。これは特殊なタイプのオブジェクトです。つまり、JVM(Java仮想マシン)によって再利用されます。オブジェクトをシリアル化するこのプロセスは、オブジェクトのデフレーションまたはマーシャリングとも呼ばれます。
シリアル化するオブジェクトは、インターフェイスを実装する必要がありますjava.io.Serializable
。オブジェクトのデフォルトのシリアル化メカニズムは、オブジェクトのクラス、クラスシグネチャ、およびすべての非一時フィールドと非静的フィールドの値を書き込みます。
class ObjectOutputStream extends java.io.OutputStream implements ObjectOutput,
ObjectOutput
interfaceは、DataOutput
インターフェイスを拡張し、オブジェクトをシリアル化してファイルにバイトを書き込むためのメソッドを追加します。 インターフェイスをObjectOutputStream
拡張java.io.OutputStream
および実装します。ObjectOutput
オブジェクト、配列、およびその他の値をストリームにシリアル化します。したがって、のコンストラクタは 次のようにObjectOutputStream
記述されます。
ObjectOutput ObjOut = new ObjectOutputStream(new FileOutputStream(f));
上記のコードは、のインスタンスをパラメーターとして受け取るコンストラクターを使用してObjectOutput
クラスのインスタンスを作成するために使用されています。ObjectOutputStream( )
FileOuputStream
ObjectOutput
インターフェイスは、クラスを実装することによって使用されますObjectOutputStream
。はObjectOutputStream
、オブジェクトをシリアル化するように構築されています。
Javaでのオブジェクトの逆シリアル化
シリアル化の反対の操作は逆シリアル化と呼ばれます。つまり、一連のバイトからデータを抽出することは逆シリアル化と呼ばれ、インフレーションまたはアンマーシャリングとも呼ばれます。
ObjectInputStream
インターフェイスを拡張java.io.InputStream
および実装しObjectInput
ます。オブジェクト、配列、およびその他の値を入力ストリームから逆シリアル化します。したがって、のコンストラクタは 次のようにObjectInputStream
記述されます。
ObjectInputStream obj = new ObjectInputStream(new FileInputStream(f));
上記のプログラムのコードは、ObjectInputStream
クラスによってシリアル化されたファイルを逆シリアル化するためのクラスのインスタンスを作成しますObjectInputStream
。上記のコードは、コンストラクターが入力ストリームを必要とするFileInputStream
ため、逆シリアル化する必要がある指定されたファイルオブジェクトを保持するクラスのインスタンスを使用してインスタンスを作成します。ObjectInputStream()
シリアライゼーションとは、Java オブジェクトをバイト配列に変換してから、保持された状態で再びオブジェクトに戻すプロセスです。ネットワーク経由でオブジェクトを送信したり、ディスクにキャッシュしたりするなど、さまざまなことに役立ちます。
プロセスのプログラミング部分を非常によく説明しているこの短い記事を読んでから、 Serializable javadocに進んでください。この関連する質問を読むことにも興味があるかもしれません。
ファイルをオブジェクトとして返す: http://www.tutorialspoint.com/java/java_serialization.htm
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 = new 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();
}
}
}
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);
}
}