Javaでは、すべてがオブジェクトであり、分散環境では、ネットワークまたはデバイスの一方の端からもう一方の端にオブジェクトを渡す必要があることがよくあります。これには、両端にデータを送信できるプロトコルが必要です。 Javaシリアル化メカニズムは、この問題を解決するために作成されます。
オブジェクト状態をバイトストリームに変換した後、java.ioパッケージのさまざまなバイトストリームのクラスを使用してファイルに保存したり、別のスレッドにパイプしたり、ネットワーク接続を介して別のホストにオブジェクトデータを送信したりできます。オブジェクトのシリアル化関数は非常にシンプルで強力であり、RMI、Socket、JMS、およびEJBで使用されています。オブジェクトのシリアル化の問題は、ネットワークプログラミングで最も中心的な問題ではありませんが、非常に重要であり、多くの実際的な重要性を持っています。
Javaオブジェクトのシリアル化は、1つのオブジェクトのデータを保持するだけでなく、オブジェクトによって参照される各オブジェクトのデータを再帰的に保存します。オブジェクト全体の階層は、バイトストリームに書き込まれたり、ファイルに保存されたり、ネットワーク接続に渡されたりできます。オブジェクトのシリアル化を使用して、オブジェクトの「ディープコピー」、つまりオブジェクト自体と参照されるオブジェクト自体をコピーすることができます。オブジェクトをシリアル化すると、オブジェクト全体のシーケンスが発生する可能性があります。
基本的な使用方法:
シリアル化とは、ファイル、バイトストリーム、ネットワークデータストリームなど、クラスまたは基本データ型をデータストリームに持続することを指します。
Javaでのシリアル化の実装は、主にObjectoututttreamとObjectInputStreamの2つのクラスに依存しています。それらは、Java IOシステムのoutputStreamとinputstreamのサブクラスです。それらはJava IOのストリームであるため、ストリームのように操作できます。これらの使用方法は次のとおりです。
java.io.bytearrayinputStreamをインポートします。 java.io.bytearrayoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.io.objectinputStreamをインポートします。 java.io.objectOutputStreamをインポートします。 java.io.serializableをインポートします。パブリッククラスのペア実装シリアル化可能{プライベート静的最終long serialversionuid = -1874850715617681161L;プライベートINTタイプ。プライベート文字列名; public int getType(){return type; } public void setType(intタイプ){this.type = type; } public string getname(){return name; } public void setName(string name){this.name = name; } public Pair(intタイプ、文字列名){super(); this.type = type; this.name = name; } public static void main(string [] args)throws ioException、classNotFoundException {// todo auto-foundated method stub // serialize objectペアbytearrayoutputstream bos = new bytearrayoutputStream(); ObjectOutputStream OOS = new ObjectOutputStream(BOS);ペアペア= new Pair(1、 "Charlie"); oos.writeobject(pair); //オブジェクトをdeserialize、新しいオブジェクトを取得しますnewPair bytearrayinputStream bis = new bytearrayinputStream(bos.tobytearray()); ObjectInputStream ois = new ObjectInputStream(bis);ペアnewpair =(pair)ois.readobject(); system.out.println(newpair.getType()+":"+newPair.getName()); }}1.両方のクラスは、デコレーターパターンにあります。それらを作成するときは、バイトベースのストリームを渡す必要があります。これらのストリームは、以下にシリアル化されたデータを実際に保存するストリームです。
2.永続的なクラスは、シリアル化可能なインターフェイスを実装する必要があります。このインターフェイスには機能はありませんが、単なるマークインターフェイスです。 1つのマシンでシリアル化が実行され、結果のデータが脱シリア化のために別のマシンに送信される場合、これら2つのマシンのクラスはまったく同じである必要があります。そうしないと、シリアル化は成功しません。
3.上記のコードで文字列を取得してから、この文字列からbytearrayinputStreamを取得してから、それを脱isizeすることを忘れないでください。 BOSはバイトに保存されます。文字に格納されている文字列に変換すると、必然的にデータの変更が発生し、文字列から描画されたバイト[]は以前のバイトではありません。シリアル化されたデータをXMLファイルに保存したいので、この問題に遭遇しました。この問題に対する私の具体的な解決策の別の記事を参照してください。
www.vevb.com/article/88130.htm
Java Virtual Machineは、シリアル化して脱必要にされるときに何をしますか?
これら2つのクラスの説明におけるJavaシリアル化メカニズムについては、Javadocで詳しく説明しています。
引用
オブジェクトのデフォルトのシリアル化メカニズムは、オブジェクトのクラス、クラスの署名、およびすべての非転移および非静的フィールドの値を書き込みます。他のオブジェクトへの参照(過渡フィールドまたは静的フィールドを除く)により、これらのオブジェクトも記述されます。単一のオブジェクトへの複数の参照は、オブジェクトのグラフをオリジナルが書かれたときと同じ形状に復元できるように、参照共有メカニズムを使用してエンコードされます。
デフォルトのシリアル化メカニズムは、データをストリームに書き込みます。
1。オブジェクトが属するクラス
2。クラスの署名
3.すべての非転移および非静的特性
4。他のオブジェクトへの参照も、これらのオブジェクトのシリアル化を引き起こします。
5.複数の参照がオブジェクトを指している場合、共有参照メカニズムが使用されます。
引用
シリアル化および脱派化プロセス中に特別な取り扱いを必要とするクラスは、これらの正確な署名を使用して特別な方法を実装する必要があります。
private void readobject(java.io.objectinputStreamストリーム)は、ioException、classNotFoundExceptionをスローします。 private void writeObject(java.io.objectoutputStreamストリーム)スローIOExceptionプライベートvoid readobjectnodata()throws objectstreamexception;