5

こんなクラスがありますが、

class SampleClass implements Serializable {
    String name;
    Serializable fieldName;
}

そして、次のような別のクラス

class AnotherClass implements Serializable {
    SampleClass sampleClass;
}

両方のクラスに getter メソッドと setter メソッドがあります。

メインクラスでは、sampleClassゲッター関数から変数を取得し、sampleClassオブジェクトを使用しようとしています。しかし、それを使用していると、次のようなエラーが発生しますcould not deserialize

のメンバーにアクセスする方法SampleClass、またはタイプのフィールド メンバーを使用しSerializableますか?

ありがとう。


編集済み:私は hibernate を使用しています。これは、aemploye テーブルと aaddress テーブルの間で多対 1 の関係を使用します。

上記の 2 つのテーブルに対して、ネット Bean に Hibernate 構成ファイルとリバース エンジニアリング ファイルを作成しました。

次に、POJO クラスを生成しました。

クラスとxmlは次のとおりです。

Aaddress.hbm.xml

<hibernate-mapping>
<class name="hibernatetutor.tablebeans.Aaddress" table="aaddress" schema="public">
    <id name="sno" type="int">
        <column name="sno" />
        <generator class="assigned" />
    </id>
    <property name="street" type="serializable">
        <column name="street" />
    </property>
    <set name="aemployes" inverse="true">
        <key>
            <column name="address" />
        </key>
        <one-to-many class="hibernatetutor.tablebeans.Aemploye" />
    </set>
</class>

Aemploye.hbm.xml

<hibernate-mapping>
<class name="hibernatetutor.tablebeans.Aemploye" table="aemploye" schema="public">
    <id name="id" type="int">
        <column name="id" />
        <generator class="assigned" />
    </id>
    <many-to-one name="aaddress" class="hibernatetutor.tablebeans.Aaddress" fetch="select">
        <column name="address" />
    </many-to-one>
    <property name="name" type="string">
        <column name="name" />
    </property>
</class>

Aaddress.java

public class Aaddress implements java.io.Serializable {

    private int sno;
    private Serializable street;
    private Set aemployes = new HashSet(0);

    public int getSno() {
        return this.sno;
    }

    public void setSno(int sno) {
        this.sno = sno;
    }

    public Serializable getStreet() {
        return this.street;
    }

    public void setStreet(Serializable street) {
        this.street = street;
    }

    public Set getAemployes() {
        return this.aemployes;
    }

    public void setAemployes(Set aemployes) {
        this.aemployes = aemployes;
    }
}

Aemploye.java

public class Aemploye implements java.io.Serializable {

    private int id;
    private Aaddress aaddress;
    private String name;

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Aaddress getAaddress() {
        return this.aaddress;
    }

    public void setAaddress(Aaddress aaddress) {
        this.aaddress = aaddress;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Main.java

private void getData() {
    Session session = HibernateUtils.getInstance().openSession();
    Query query = session.createQuery("from Aemploye where id=:id");
    query.setParameter("id", 1);
    Aemploye a = (Aemploye) query.uniqueResult();
    Aaddress a1 = a.getAaddress();
    System.out.println(a1.getStreet());
}

エラーは次のとおりです。

org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:217)
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:240)
    at org.hibernate.type.SerializableType.fromBytes(SerializableType.java:82)
    at org.hibernate.type.SerializableType.get(SerializableType.java:39)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154)
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2096)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1380)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308)
    at org.hibernate.loader.Loader.getRow(Loader.java:1206)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580)
    at org.hibernate.loader.Loader.doQuery(Loader.java:701)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3044)
    at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:395)
    at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:98)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
    at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:836)
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:66)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
    at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
    at hibernatetutor.tablebeans.Aaddress$$EnhancerByCGLIB$$44bec229.getStreet(<generated>)
    at hibernatetutor.Main.getData(Main.java:33)
    at hibernatetutor.Main.main(Main.java:24)
Caused by: java.io.StreamCorruptedException: invalid stream header
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
    at org.hibernate.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:252)
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:209)
    ... 29 more
4

3 に答える 3

1

質問とコメント セクションからの情報の一部の両方に基づいて、あなたの問題は次のことが原因であると考えています。

なんらかの理由で、street 属性をシリアライズ可能なタイプに選択しました。あなたのテーブルでは、この列は type として定義されていますTEXT。Hibernate はおそらくシリアル化されたデータを列に保存できますが、データベースはおそらくそれらを変更されないままに保つことができません。したがって、取得時に、文字化けしたシリアライズがデシリアライズに失敗します。

解決策は、Petr Pudlák が指摘したように、マッピングを正しくすることです。などの適切なバイナリ タイプを選択するBYTEAと、バイナリ データを変更せずに保存できます。その後、取得が機能するはずです。

これは、最初にJavaコードで適切なデータ型を選択するという正しい解決策ではありません。通りのタイプをシリアライズ可能にすることは、コードを表示する人にとって混乱を招きます。Stringおそらくより理にかなっており、列タイプにも適していますTEXT

于 2012-08-09T12:20:16.590 に答える
0

これを行うための非常に珍しいフレームワークがない限り、ゲッターを使用してもシリアル化は必要ありません。

正確なスタック トレースを見て (そして質問に投稿して)、例外が実際に発生している場所を確認することをお勧めします。

于 2012-08-09T07:57:33.690 に答える
0

私はあなたのクラスを試しました、そしてそれは私のために働きます:

import java.io.*;

class SampleClass implements Serializable {
      String name;
      Serializable fieldName;
}

class AnotherClass implements Serializable {
      SampleClass sampleClass;
}

public class Ser {
    public static void main(String argv[])
        throws Exception
    {
        SampleClass s = new SampleClass();
        s.name = "name";
        s.fieldName = "fieldName";

        AnotherClass a = new AnotherClass();
        a.sampleClass = s;

        // serialize the classes to a byte array
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(a);
        oos.close();

        // deserialize the classes from the byte array
        ObjectInputStream is
            = new ObjectInputStream(
                    new ByteArrayInputStream( os.toByteArray() ));
        a = (AnotherClass)is.readObject();
        is.close();

        // print something
        System.out.println(a.sampleClass.name);
    }
}

問題の原因となっている正確なコードを投稿できますか?

于 2012-08-09T07:58:25.040 に答える