2012-08-09 13 views
5

que tiene una clase como esta,Hibernate lanza StreamCorruptedException: cabecera de transmisión no válida

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

Y otra clase como,

class AnotherClass implements Serializable { 
    SampleClass sampleClass; 
} 

donde ambos clase tiene sus métodos get y set.

En la clase principal, obtengo la variable sampleClass de la función getter, y trato de usar los objetos sampleClass. Pero cuando estoy usando eso, encuentro el error como, could not deserialize.

¿Cómo acceder a los miembros de SampleClass, o tendremos miembros de campo del tipo Serializable?

Gracias.


Editado: estoy usando Hibernate, que utiliza muchos a uno relación entre tablas y aemploye aaddress.

Creé el archivo de configuración de Hibernate y el archivo de ingeniería inversa en net beans para las dos tablas anteriores.

Luego genere la clase POJO.

La clase y XML son:

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

El error es:

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

agregue captadores y adaptadores adecuados –

+1

¿Se puede publicar algún código? Es difícil ayudar de otra manera. – Dahaka

+0

¿Qué error obtuviste? – Thilo

Respuesta

1

El uso de un captador no involucra seria lización a menos que tenga un marco muy inusual para hacer esto.

Te sugiero que busques el rastro exacto de la pila (y lo publiques en la pregunta) y veas dónde está ocurriendo realmente la excepción.

1

me trataron sus clases, y funciona para mí:

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

Se puede publicar el código exacto que causa el problema?

+0

Mire el área editada .. Estoy usando Hibernate SQL para obtener el valor de las tablas. session.createQuery ("desde Aemploye"). Esto poblará Aemploye y Aadress beans con los valores de las tablas. Ahora puedo acceder a los valores en Aemploye Bean pero, cuando intento acceder a Aadress, muestra el error anterior ... – Boopathy

1

Sobre la base tanto de la cuestión, y parte de la información de la sección de comentarios, creo que sus problemas son causados ​​por el siguiente:

Tiene por alguna razón elegido la calle atributo a ser de tipo serializable . En su tabla, esta columna se ha definido como del tipo TEXT. Hibernate probablemente se las arregla para guardar los datos serializados en la columna, pero la base de datos probablemente no los conserve inalterados. Por lo tanto, en la recuperación, el serializado ahora mutilado no se deserializa.

La solución es, como Petr Pudlák señaló, para que su mapeo sea correcto. Si elige un tipo binario adecuado, como BYTEA, entonces podrá almacenar los datos binarios sin modificaciones. La recuperación debería funcionar.

Esta no es la solución correcta en mi humilde opinión, que en primer lugar sería elegir un tipo de datos adecuado en su código de Java. Tener el tipo de calle Serializable es confuso para cualquiera que vea tu código. String probablemente tenga más sentido, y también sería una buena opción para el tipo de columna TEXT.

Cuestiones relacionadas