0

DB での Class オブジェクトの永続化に問題があります。

オブジェクトを使用してオブジェクトをバイト配列に変換しようとしましたObjectArrayOutputStreamByteArrayOutputStream以下に示すように、バイト配列を永続化しました。

Class klazz = getClassForClassDef();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(klazz);
baos.toByteArray();

しかし、以下に示すエラーが表示されます。

java.lang.ClassFormatError: Incompatible magic value 2901213189 in class file

バイト配列の構築方法に問題があると思います。.classしかし、クラス オブジェクトに相当するものを正しく作成する方法がわかりません。

4

3 に答える 3

2

あなたが本当にそれ自体を保存Classしようとしているなら:

あなたはここでそれについてもっと読むことができます:https ://stackoverflow.com/a/2390763/1001027

オブジェクトを保存しようとしている場合:

Classメソッドのパラメータとしてを使用していますwriteObject。これの代わりに、あなたが持っているインスタンスを使うべきです。


// write the class
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(objectToSerialize);

// this you need to store
byte[] data = baos.toByteArray();

// read it again (just a test)
ByteArrayInputStream bais = new ByteArrayInputStream(data);
Object restored = new ObjectInputStream(bais).readObject();

// write what came from the deserialization
System.out.println(restored);

サンプルでは、​​変数objectToSerializeは保存するオブジェクトを保持します。


Javaシリアル化オブジェクトをデータベースに本当に保存してもよろしいですか?これにはいくつかの選択肢があります。HibernateなどのORMフレームワークを使用して正式なモデルを作成できます。

これが動的すぎると思われる場合は、XStreamなどのXMLシリアル化やJSONシリアル化を使用できます。これは読み取り可能な形式であるため、実際に保存されているものを確認でき、Javaで逆シリアル化する必要がありません。状態を確認するだけのアプリケーション。

于 2012-07-07T10:55:43.003 に答える
1

オブジェクトをシリアル化するには、クラスではなくオブジェクト自体をストリームに書き込む必要があります。さらに、オブジェクトインスタンスはSerializableインターフェイスを実装する必要があり、そのすべての内部フィールドはシリアル化可能または一時的である必要があります。

コードでは、oos.writeObject(klazz);を書く代わりに、保存したいオブジェクトインスタンスをoos.writeObject(obj);提供します。obj

ただし、JavaオブジェクトをDBに格納しようとしている場合(リレーショナルDBについて話しているのではありませんか?)、オブジェクトをテーブルにマップし、各属性を列の値として格納します。そうすれば、SQLと列の値を使用して検索と結合を実行できますが、バイナリフィールドにインデックスを付けることはできません。

于 2012-07-07T10:47:27.807 に答える
1

.classファイルはシリアル化されたClassオブジェクトではありません。これはまったく異なるものであり、単純なJavaコードでは作成できません。しかし、なぜあなたはしたいのですか?あなたはすでにその.classファイルをディスク上に持っています、それはあなたのJavaプログラムがクラスについて知るようになった方法です。.classそのファイルをコピーしてみませんか?それがどこから来たのか(どのJARか)を見つけることだけが問題になります。

于 2012-07-07T11:20:11.630 に答える