2012-08-09 83 views
5

我有這樣一個類,休眠拋出StreamCorruptedException:無效的流頭

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

而另一個類一樣,

class AnotherClass implements Serializable { 
    SampleClass sampleClass; 
} 

其中兩個類都有自己的getter和setter方法。

在主類中,我從getter函數獲取sampleClass變量,並嘗試使用sampleClass對象。但是當我使用它時,我遇到了像could not deserialize這樣的錯誤。

如何訪問SampleClass的成員,或者我們是否有Serializable類型的現場成員?

謝謝。


編輯: 我使用休眠,它使用許多人aemploye和aaddress表之間的一個關係。

我爲上述兩個表創建了Hibernate配置文件和net beans中的逆向工程文件。

然後我生成了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 
+0

添加適當的getters和setters到它 – 2012-08-09 07:47:20

+1

你可以發佈一些代碼?否則很難提供幫助。 – Dahaka 2012-08-09 07:47:48

+0

你得到了什麼錯誤? – Thilo 2012-08-09 07:50:52

回答

1

使用吸氣不涉及詩里亞除非你有一些非常不尋常的框架來做到這一點。

我建議你看看確切的堆棧跟蹤(並在問題中發佈)並查看異常實際發生的位置。

1

我想你的類,它的工作對我來說:

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); 
    } 
} 

你能後引起問題的確切的代碼?

+0

請看編輯區域..我使用Hibernate SQL來獲取值從桌子上。 session.createQuery(「來自Aemploye」)。這將使用來自表的值填充Aemploye和Aadress bean。現在我可以訪問Aemploye bean中的值,但是,當我嘗試訪問Aadress時,它顯示上述錯誤... – Boopathy 2012-08-09 09:47:11

1

在這兩個問題的基礎上,一些來自注釋部分的信息,相信你的煩惱是由以下原因造成的:

您有選擇的街道某種原因屬性爲類型序列化的。在您的表格中,此列已被定義爲類型TEXT。 Hibernate可能會設法將序列化數據保存到列中,但數據庫可能無法保持不變。因此,在檢索時,現在亂碼的序列化無法反序列化。

解決方案是,作爲PetrPudlák指出的,以使您的映射正確。如果您選擇了合適的二進制類型,例如BYTEA,那麼您將能夠保存二進制數據不變。檢索應該工作。

這不是正確的解決方案恕我直言,這將是首先在您的Java代碼中選擇合適的數據類型。將街道的類型設置爲可串行化對查看您的代碼的任何人都很困惑。 String可能會更有意義,並且也適用於列類型TEXT

相關問題