引数なしのコンストラクターとシリアライズ可能な実装を必要とせずにシリアライズする方法はありますか?
9 に答える
XStream、JSXまたはGoogle Protocol Buffersを見てください。
JBossシリアライゼーションは、標準の Java シリアライゼーションのドロップイン置換であり、実装する必要はありませんjava.io.Serializable
。それ以外 (およびそれがはるかに高速であるという事実) は、標準のシリアライゼーション メカニズムと同じです (同じObjectInput
およびObjectOutput
インターフェイスを使用します。
PS 他の JBoss との依存関係はありません。別のプロジェクトとして分割された JBoss の低レベル ライブラリの 1 つにすぎません。
これを行う恐ろしい方法は、クラスの並列階層を構築することです。各クラスは、サードパーティ階層内のクラスの 1 つを代用し、それぞれが Externalizable を実装し、サードパーティから適切なフィールドを書き込むことによって自身を書き込みます。パーティのオブジェ。
しかし、私はしません。
そしてDataboard、Bean スタイル、レコード スタイル、および不変スタイルのクラスをシリアル化できます。独自のクラス外部バインディングを作成することもできます。
http://www.jguru.com/faq/view.jsp?EID=251942の説明を参照してください。
を実装するクラスのコンストラクターに関する唯一の要件はSerializable
、継承階層内の最初のシリアル化不可能なスーパークラスに、引数のないコンストラクターが必要であることです。
引数なしのコンストラクターを使用して拡張
Object
するように、引数なしのコンストラクターなしでシリアライズ可能public class MySerializableClass implements Serializable { public MySerializableClass (...)... }
引数なしのコンストラクターを使用して拡張
MyFirstClass
するように、引数なしのコンストラクターなしでシリアライズ可能public class MyFirstClass { } public class MySecondClass extends MyFirstClass implements Serializable { public MySecondClass (...)... }
MyFirstClass
実装されSerializable
ておらず、デフォルトのコンストラクターがないため、シリアル化できません。public class MyFirstClass { public MyFirstClass (...)... } public class MySecondClass extends MyFirstClass implements Serializable { public MySecondClass (...)... }
Type の宣言にもかかわらず、シリアル化を強制できる場合があると思います。ただし、クラスにはシリアル化できないフィールドが含まれている可能性があり、ランタイム例外が発生する固有のリスクがあります。
カスタムコンストラクターを作成していない限り、引数なしのデフォルトコンストラクターを無料で取得できるので、私は興味があります。また、Serializable を実装すると、検索/置換に 30 秒かかります。
これらを避けようとしている理由はありますか?
...そしてSerializableの実装?
残念ながら違います。すべての Serializable オブジェクトは を実装する必要がありjava.io.Serializable
ます。質問の最初の部分については、ObjectInputStream
/ObjectOutputStream
を使用してオブジェクトをバイト配列にシリアル化したり、その逆を行うことができます。
次の例は、次の方法を示しています。
public static byte[] toByteArray(Object object) throws IOException {
if (!isSerializable(object)) {
throw new IOException("Object '" + object.getClass().getName() + "' is not serializable.");
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
oos.flush();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
logger.error("Closing of ObjectOutputStream failed.", e);
}
}
}
return baos.toByteArray();
}
public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException {
Object object = null;
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
object = ois.readObject();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
logger.error("Closing of ObjectInputStream failed.", e);
}
}
}
return object;
}
他の人が言っているように、さまざまな選択肢があります。writeObject と readObject を使用した標準の Java シリアライゼーションに固執する場合は、サード パーティ クラスから継承する独自のアダプター クラスを作成し、独自のクラスに Serializable を実装し、writeObject と readObject をオーバーライドします。つまり、カスタム シリアライゼーションを実装します。あなたのクラス。
Eishay Smith は、Java シリアライザーのベンチマークを行いました。これには、それぞれについての情報が含まれていますが、引数なしのコンストラクターを使用しているかどうかについては言及されていません (多くの場合、任意のオブジェクトでも機能しないため、問題は意味がない)。それは一見の価値があるかもしれません。