2012-08-09 12 views
5

Mam klasy jak ten,Hibernate rzuca StreamCorruptedException: nieprawidłowy nagłówek strumień

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

a inna klasa podobnego,

class AnotherClass implements Serializable { 
    SampleClass sampleClass; 
} 

gdzie zarówno klasa ma swoje metody getter i setter.

W klasie głównej otrzymuję zmienną sampleClass z funkcji gettera i próbuję użyć obiektów sampleClass. Ale kiedy używam tego, napotykam błąd jak, could not deserialize.

Jak uzyskać dostęp do członków SampleClass, czy też mamy elementy polowe typu Serializable?

Dzięki.


Zmieniano: używam hibernacji, który wykorzystuje wiele do jednego relacji aemploye i aaddress tabelach.

Utworzono plik konfiguracji Hibernate oraz plik inżynierii odwrotnej w siatkach netto dla powyższych dwóch tabel.

Następnie wygenerowałem klasę POJO.

Klasa i xml są:

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

Błąd jest:

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

dodaj do niego odpowiednie programy pobierające i ustawiające –

+1

Czy możesz dodać kod? W przeciwnym razie trudno jest pomóc. – Dahaka

+0

Jaki błąd dostałeś? – Thilo

Odpowiedz

1

Korzystanie z getter nie wiąże Seria lizacji, chyba że masz do tego bardzo nietypowe ramy.

Sugeruję, abyś spojrzał na dokładny ślad stosu (i opublikował go w pytaniu) i zobaczył, gdzie faktycznie występuje wyjątek.

1

Próbowałem swoje klasy, a to działa na mnie:

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

Można zaksięgować dokładny kod, który powoduje ten problem?

+0

Proszę spojrzeć na edytowany obszar .. Używam Hibernate SQL, aby uzyskać wartość z tabel. session.createQuery ("od Aemploye"). Spowoduje to wypełnienie fasoli Aemploye i Aadress wartościami z tabel. Teraz mogę uzyskać dostęp do wartości w fasoli Aemploye, ale gdy próbuję uzyskać dostęp do Aadress, pokazuje powyższy błąd ... – Boopathy

1

Na podstawie zarówno pytania, a niektóre z informacji z sekcji komentarzy, wierzę, twoje problemy są spowodowane przez następujący:

masz na jakiegoś powodu wybraną ulicę przypisują być typu serializable . W tabeli tej kolumna została zdefiniowana jako typ TEXT. Hibernate prawdopodobnie udaje się zapisać zserializowane dane do kolumny, ale baza danych prawdopodobnie nie zdoła utrzymać ich niezmienionych. Dlatego przy pobieraniu, teraz zniekształcony szeregowy błąd do deserializacji.

Rozwiązaniem jest , ponieważ Petr Pudlák zanotował, aby uzyskać poprawne mapowanie. Jeśli wybierzesz odpowiedni typ binarny, taki jak BYTEA, będziesz mógł przechowywać niezmienione dane binarne. Pobieranie powinno wtedy działać.

To nie jest właściwe rozwiązanie IMHO, które w pierwszej kolejności wybrałoby odpowiedni typ danych w kodzie Java. Typ ulicy, która ma być Serializowalna, jest mylący dla każdego, kto ogląda twój kod. String prawdopodobnie miałoby więcej sensu i byłoby dobrze dopasowane do typu kolumny TEXT.

Powiązane problemy