質問
い:
class MyClass extends MyClass2 implements Serializable {
//...
}
にMyClass2客様の電話番号をお知らせ下さいしない直列化可能です。たいのですがserialize(de-serialize)このオブジェクト?
修正:MyClass2はもちろん、インターフェースはクラスです。
解決
としての人は、第11章のジブロッホの 有効なJava は欠かせないリソースのJava直列化します。
カップルポイントすることとなったことが適切なご質問:
- と仮定したいserializeの状態を非直列化可能フィールドにMyClass2、この分野からアクセスできなければなMyClassよsetterか、セッター.MyClassすためにはカスタム直列化により提供するreadObjectおよびwriteObjectの方法。
- 非直列化可能フィールドのクラスは、APIによってこの状態を書き込むためのオブジェクトストリーム)の後にスをインスタンス化新しいインスタンスとする場合、後から読み込むオブジェクトストリームです。)
- 当たり74項目の有効なJava、MyClass2 必要 を持つ引数をとるコンストラクタにMyClass、そうでないことは不可能MyClass延MyClass2を直列化可能です。
長々と書きましたが、迅速例を以下に示す。
class MyClass extends MyClass2 implements Serializable{
public MyClass(int quantity) {
setNonSerializableProperty(new NonSerializableClass(quantity));
}
private void writeObject(java.io.ObjectOutputStream out)
throws IOException{
// note, here we don't need out.defaultWriteObject(); because
// MyClass has no other state to serialize
out.writeInt(super.getNonSerializableProperty().getQuantity());
}
private void readObject(java.io.ObjectInputStream in)
throws IOException {
// note, here we don't need in.defaultReadObject();
// because MyClass has no other state to deserialize
super.setNonSerializableProperty(new NonSerializableClass(in.readInt()));
}
}
/* this class must have no-arg constructor accessible to MyClass */
class MyClass2 {
/* this property must be gettable/settable by MyClass. It cannot be final, therefore. */
private NonSerializableClass nonSerializableProperty;
public void setNonSerializableProperty(NonSerializableClass nonSerializableProperty) {
this.nonSerializableProperty = nonSerializableProperty;
}
public NonSerializableClass getNonSerializableProperty() {
return nonSerializableProperty;
}
}
class NonSerializableClass{
private final int quantity;
public NonSerializableClass(int quantity){
this.quantity = quantity;
}
public int getQuantity() {
return quantity;
}
}
他のヒント
MyClass2はインターフェースでtechinicalyではない物件だけます。れていればインスタンス変数がないserializeableみさんの車いますので、ちょっとした用を宣言するのにその分野の一過性です
ex:
private transient Foo foo;
きを宣言する分野の過渡的な方法で実装することが可能です。中の直列化と直列化復元す。意いただく場合、直列化復元オブジェクトと一過性分野のフィールドの値は常にこのデフォルト(通常はnullになります。)
注も可能ですオーバーライドは、readResolve()メソッドのクラスを初期化するために、一過性の分野に基づくその他のシステムの状態です。
可能な場合には、非serialiable部品として設定が可能ですが、過渡
private transient SomeClass myClz;
その他利用できる Kryo.Kryoは、オブジェクトのグラフは直列化の枠組みのためのJava(JAVAの直列化は、java.awt.色が必要で170バイトKryo4バイト)でserializeも非直列化可能オブジェクト。Kryoでも自動的に行う深の浅いコピー/クローンこれは直接コピーからのオブジェクトのオブジェクトな object->bytes->object
.
ここでは例の使い方kryo
Kryo kryo = new Kryo();
// #### Store to disk...
Output output = new Output(new FileOutputStream("file.bin"));
SomeClass someObject = ...
kryo.writeObject(output, someObject);
output.close();
// ### Restore from disk...
Input input = new Input(new FileInputStream("file.bin"));
SomeClass someObject = kryo.readObject(input, SomeClass.class);
input.close();
直列化されたオブジェクトでも圧縮による登録の正確なシリアライザ:
kryo.register(SomeObject.class, new DeflateCompressor(new FieldSerializer(kryo, SomeObject.class)));
場合を修正することができMyClass2、簡単な方法は住所ことを宣言するのに一過性です
が必要となりますの実施 writeObject()
や readObject()
やマニュアルを直列化/直列化復元のメッセージ-アドバイスのjavadocのページ java.io.Serializable
ます。ジブロッホの 有効なJava また、いくつかの良いる章を実施する強固な安直列化します。
ってなぜその一員MyClass2な直列化可能です。
があればいくつかの良い理由MyClass2できない表現に直列化された形式、チャンスも同様の理由が挙げられるためMyClassがいるので、それらのサブクラス.
で書くことができカスタム直列化された形式のためのMyClassの実施によりreadObjectおよびwriteObjectは、この状態MyClass2インスタンスデータMyClassを適切に行うことができ再現に直列化されたデータです。この場合MyClass2のAPIを固定すことはできません追加す直列化可能です。
ですねMyClass2な直列化可能、も変えることはできない。
きを見る 過渡 キーワードになるものであるが、分野として、永続的な状態でオブジェクトです。
複数の可能性をpopedしてい履歴書をこちら:
- 実施writeObjectとreadObject()として sk ことを示唆
- を宣言するのに一過性について直列化されたとして最初に述べたように ハンク
- 利用XStreamが述べたように boris-terzic
- 利用シリアルプロキシとしては トム-hawtin-tackline
XStream 大図書館という高速Java XMLを直列化のためのanyオブジェクトにない場合は、直列化可能です。場合でも、XMLターゲット形式に合わない、使用でき、ソースコードなどのことを思い出します。
有用なアプローチのためのserialisingインスタンスの直列化可能クラス(または少なくともサブクラス)で知られるシリアルに行います。質を実装するwriteReplaceへのインスタンスを返すのは全く異なるserializableを実装するクラスreadResolveへのコピーを返し元のオブジェクトです。しっかりとした例serialising java.awt.BasicStrokeに Usenet