2012-08-09 37 views
5

Tôi có một lớp học như thế này,Hibernate ném StreamCorruptedException: không hợp lệ dòng tiêu đề

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

Và một lớp như thế nào,

class AnotherClass implements Serializable { 
    SampleClass sampleClass; 
} 

nơi cả hai lớp có getter và setter của họ.

Trong lớp học chính, tôi nhận được biến số sampleClass từ hàm getter và cố gắng sử dụng các đối tượng sampleClass. Nhưng khi tôi sử dụng nó, tôi gặp lỗi như, could not deserialize.

Cách truy cập các thành viên của SampleClass hoặc chúng tôi có các thành viên hiện trường thuộc loại Serializable không?

Cảm ơn.


được sửa đổi: Tôi đang sử dụng chế độ ngủ đông, trong đó sử dụng nhiều đến một mối quan hệ giữa aemploye và aaddress bảng.

Tôi đã tạo tệp cấu hình Hibernate và tệp kỹ thuật đảo ngược trong hạt thuần, cho hai bảng trên.

Sau đó, tôi đã tạo lớp POJO.

Lớp và xml là:

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

Lỗi này là:

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

thêm getters và setters thích hợp vào nó –

+1

Bạn có thể đăng một số mã không? Thật khó để giúp đỡ khác. – Dahaka

+0

Lỗi nào bạn nhận được? – Thilo

Trả lời

1

Sử dụng một getter không liên quan đến seria lization trừ khi bạn có một số khuôn khổ rất bất thường để làm điều này.

Tôi khuyên bạn nên xem dấu vết ngăn xếp chính xác (và đăng nó trong câu hỏi) và xem nơi ngoại lệ thực sự xảy ra.

1

tôi đã cố gắng lớp học của bạn, và nó làm việc cho tôi:

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

Bạn có thể gửi mã chính xác gây ra vấn đề?

+0

Hãy xem xét khu vực đã chỉnh sửa .. Tôi đang sử dụng Hibernate SQL để lấy giá trị từ các bảng. session.createQuery ("từ Aemploye"). Điều này sẽ cư trú Aemploye và Aadress đậu với các giá trị từ bảng. Bây giờ tôi có thể truy cập vào các giá trị trong đậu Aemploye nhưng, khi tôi cố gắng truy cập Aadress, nó sẽ hiển thị lỗi trên ... – Boopathy

1

Trên cơ sở của cả hai câu hỏi, và một số các thông tin từ phần bình luận, tôi tin rằng những rắc rối của bạn là do sau:

Bạn phải vì một lý do lựa chọn con đường thuộc tính là loại serializable . Trong bảng của bạn, cột này đã được định nghĩa là loại TEXT. Hibernate có thể quản lý để lưu dữ liệu tuần tự vào cột, nhưng cơ sở dữ liệu có lẽ không quản lý để giữ chúng không bị thay đổi. Do đó, khi truy xuất, chuỗi đã bị cắt xén đã bị cắt xén không được deserialize.

Giải pháp là, như Petr Pudlák đã ghi chú, để ánh xạ của bạn chính xác. Nếu bạn chọn loại nhị phân phù hợp, chẳng hạn như BYTEA, thì bạn sẽ có thể lưu trữ dữ liệu nhị phân không bị thay đổi. Quá trình truy xuất sẽ hoạt động.

Đây không phải là giải pháp đúng IMHO, sẽ chọn loại dữ liệu phù hợp trong mã java của bạn ngay từ đầu. Có loại đường phố được Serializable là khó hiểu cho bất cứ ai xem mã của bạn. String có thể có ý nghĩa hơn và cũng phù hợp với loại cột TEXT.

Các vấn đề liên quan