オブジェクト直列化
逆シリアル化の手段は、Javaオブジェクトにバイナリバイトコードファイルを変換し、バイナリファイルのバイトコードとして格納されたJavaオブジェクトの標的配列を指します。
クラスの人を考えて、直列化インターフェイスを実装
@Setter @Getter @AllArgsConstructor パブリック クラスの人は、実装Serializableを{ プライベート文字列名を、 プライベート整数歳。 }
それは読んでオブジェクトのObjectInputStreamおよびObjectOutputStreamので書き込むことができます。
// 序列化 のFileOutputStreamたFileOutputStream = 新しいのFileOutputStream( "人物" ); ObjectOutputStreamのObjectOutputStreamの = 新しいObjectOutputStreamの(のFileOutputStream)。 objectOutputStream.writeObject(新人物( "厂长"、27 )); objectOutputStream.close(); // 反序列化 のFileInputStream FileInputStreamの= 新しい FileInputStreamを( "人物" )。 ObjectInputStreamのObjectInputStreamの = 新しいObjectInputStreamの(のFileInputStream)。 人物人物 = (人物)objectInputStream.readObject();
objectInputStream.close();
System.out.println(人)。System.out.println(person.getName() + " - " + person.getAge());
Personオブジェクト・クラスのObjectOutputStreamのバイナリ出力バイナリファイルを読み込むことによって取得したオブジェクトの情報へのObjectInputStream。
直列化は、このようにオブジェクトの永続性とオブジェクトの情報を達成するための一つの方法は、ディスクに保存したり、ネットワークバイナリファイル形式を介して送信することが可能である見ることができます。
コモンズ - ラングパッケージはツールSerializationUtilsの配列を提供し、シーケンスを達成することができ、(シリアライズするデシリアライズ)及び()メソッドをデシリアライズ。
パブリック 静的 ボイドシリアル化(シリアライズOBJ、OutputStreamのOutputStreamの)
あなたは、オブジェクトの入ってくるクラスはSerializableインタフェースを実現する必要が見ることができます。
Serializableインタフェース
Serializableインタフェースは、マーカーインターフェイスです。マーカーインタフェースには、インタフェースのメソッドとプロパティが存在しないことを意味します。それだけでその実装クラスは、特定のタイプに属していることを示し、それはのinstanceofと、クエリのタイプにすることができます。
もし(人のinstanceofシリアライズ)
だけでなく、他の一般的に使用されるマーカーインターフェイスCloneableインタフェース。
シリアライズ時には、シリアル化されたクラスであるかどうかを決定します文字列、列挙型、配列またはタイプSerializableのは、それ以外の場合は例外持つNotSerializableExceptionがスローされます、です
(instanceofのOBJであれば文字列){
WriteStringメソッド((String)をOBJ、非共有)。
}そうであれば(cl.isArray()){
のwriteArray(OBJ、DESC、非共有)。
}(instanceofのOBJであれば他の列挙){
writeEnum((列挙<?> )OBJ、DESC、非共有)。 }他(OBJのinstanceof場合シリアライズ){ writeOrdinaryObject(OBJ、DESC、非共有)。 }他{場合(extendedDebugInfo){スロー新しい持つNotSerializableException(cl.getName()+ "\ n" + debugInfoStack.toString())。}他{新しい投げる持つNotSerializableException(cl.getNameを())。}}
クラスが直列であることを示し、直列化クラスインターフェースを実装します。クラスのフィールドの一部をシリアル化する必要がない場合は、過渡的な変更を使用することができます。
過渡 int型の年齢
注意:静メンバーにそれがシリアライズされませんので、シリアライズは、オブジェクトのためである、オブジェクトインスタンスに属していません。
別の使用シナリオは、多くの場合、オブジェクトはシリアライズ達成するために格納する必要があり、ハッシュredisTemplateストアとしてオブジェクトタイプを用いています。
ハッシュRedisのタイプはコードとして格納されたバイナリバイト列型の形態にすることができるオブジェクトの配列を介して、文字列型に格納されています。
<HK> バイト[] rawHashKey(HKハッシュキー){ Assert.notNull(ハッシュキー、 "必要な非ヌル・ハッシュ・キー" )。 戻る この .hashKeySerializer()== nullの &&ハッシュキーinstanceofは バイトを []?(バイト [])((バイト [])ハッシュキー):この.hashKeySerializer()(ハッシュキー)シリアライズ;。 }
this.hashKeySerializerによって着信ハッシュキーは()。シリアル化した場合には、()メソッドは、バイト[]型に変換されることがわかります。
前と後のデータの順序の正しさを保証するために、
完全なクラス名(パッケージ名+クラス名)1.デシリアライズ前のオブジェクトとオブジェクトが一致していなければならないシリアライズ、それ以外の場合は、ClassNotFoundExceptionがスローされます。
2.非直列化オブジェクトは、それ以外の場合はによりInvalidClassExceptionがスローされます、serialVersionUIDを一貫してserialVersionUIDを前にしてシリアライズされたオブジェクトである必要があります。
serialVersionUIDの
クラスバージョンをシリアル化する必要がシリアル化されたオブジェクトのデシリアライゼーション・プロセスを認証し、受信されたバージョン番号が同じオブジェクト・クラスであるかどうか、のserialVersionUIDを添加。
明示的な一般プライベート静的最終長いのserialVersionUID = 1Lセット、またはシステムが自動的に、クラス名、クラスとそのプロパティ改質剤、インターフェイスとインターフェイスシーケンスに基づいて、64ビットのハッシュ・フィールドを生成し、属性、静的初期化、コンストラクタ世代、システム生成serialVersionUIDの変化のいずれかに変化をもたらします。
明示的(クラスが上記関連特性に関連している)は、Javaシリアル化メカニズムコンパイルされたクラスに基づいて、serialVersionUIDのが定義されていない場合は、比較のためのユニークなシリアル化されたバージョンのserialVersionUIDの自動生成、
クラス構造に変化がない場合は、serialVersionUIDのは変わりません。
しかし、そのような属性名の変更など、クラスの構造が変化し、場合、属性の修飾子は、などを変更し、直列化復元を達成することはできません不一致serialVersionUIDの、になります。
(テストの後、コメントがクラス構造には影響しません、それはようで、コンパイラ関連、インターネットの結論のいくつかは、スペースであるように思わコメントに影響します)
また、別のJavaコンパイラは異なるserialVersionUIDの値を生成することができ、生成によりInvalidClassExceptionがあってはなりません。
あなたは、コンパイラの分類計画のバージョンによって強制的にしたい、と以前のバージョンと互換性のインターフェイスをシリアル化するために、クラスを達成するためにしたくないのであれば、あなたは限りシリアライズし、着信バイトストリームのクラスのデシリアライズなど、serialVersionUIDの表示を宣言する必要があります一貫性のserialVersionUIDを確保するために、彼らは、逆シリアル化を達成することが可能です。
注:互換性のある、いわゆる、多クラスフィールドを達成するために、元のシーケンスの着信類推をデシリアライズする場合、例えば、そのフィールドは無視され、小さなクラスを達成するために、元のシーケンスの着信類推をデシリアライズ場合対応するタイプのデフォルト値に割り当てられますフィールド、。
*カスタムシリアライズ
所望であれば、方法は、読み取りおよびカスタムを記述するために使用することができる、このシナリオは、インターネット、比較的まれであり、クラスはシングルトンである場合、それはカスタムシリアル化モード、同じ単一の実施形態を指定する必要があり、シリアル化を実現すると述べました。
次の2つの方法で直列化戦略をカスタマイズすることができます。
一つは、直列化クラスは、インターフェイスを実装している、2つのメソッドを定義します
プライベート ボイドのwriteObject(ObjectOutputStreamのストリーム)がスローIOExceptionが 民間 のボイドのreadObject(ObjectInputStreamのストリーム)スローにIOException、ClassNotFoundExceptionが
シリアライゼーション/デシリアライゼーション時間のwriteObject()とreadObjectによってそこに反映されているか否かをチェックするObjectInputとのOutputStreamクラス()メソッド、
クラスのwriteObjectとreadObjectメソッドのオブジェクトがある場合に直列化動作と呼ばれます。
*通過するオブジェクトのObjectStreamClass lookupStreamClass()メソッドによって具現化
ObjectStreamClass clDesc = ObjectStreamClass.lookupStreamClass(objClass)。
そこには、Beanを反射することによって上書きされるかどうかをチェックするcreateClassDescにそこ(CL)法
result.methodWriteObject = findPrivateMethod(CL、 "のwriteObject" 、WRITE_PARAM_TYPES)。
result.methodReadObject = findPrivateMethod(CL、 "readObjectメソッド"、READ_PARAM_TYPES)。
もう一つの方法は、Externalnalizableインタフェースを達成することです
writeExternalメソッド(ObjectOutputのうち))和のreadExternal(のObjectInput中)
このインタフェースは、まだ罰金を書かれていない、あまり使用しています。