2012-08-25 53 views
14

Tôi đang cố gắng sắp xếp một đối tượng và sau đó deserialize nó sau khi gửi dữ liệu của nó đến một chương trình khách hàng.Java - Deserialization InvalidClassException (Không có hàm tạo hợp lệ)

Đây là ví dụ về cách thức hoạt động của đối tượng. Đối tượng tôi sắp xếp và deserializing là người.

Living -> Động Vật -> NPC -> Người -> Child

Living, Animal, và NPC không thực hiện Serializable. Tôi không thể thay đổi ba lớp đó. Người và Trẻ em thực hiện Serializable. Con người và cuộc sống cũng là những lớp trừu tượng. Tôi có thể tuần tự hóa một Person (một Child) chỉ là tốt và gửi nó, nhưng khi tôi cố gắng deserialize một Person (một Child), tôi nhận một InvalidClassException trên Child, nói "không có constructor hợp lệ".

Tại sao điều này lại xảy ra? Phải sống, động vật, và NPC tất cả thực hiện Serializable?

+3

có thể có liên quan: http://stackoverflow.com/questions/8632148/java-object-serialization-and-inheritance – leonbloy

Trả lời

13

Tốt giải thích được thực hiện trong câu trả lời cho câu hỏi sau Deserializing an ArrayList. no valid constructor

câu chuyện dài ngắn - bạn không cần-arg constructor cho siêu lớp nonserializable đầu tiên của lớp học của bạn, NPC trong trường hợp của bạn.

Nếu bạn không có quyền truy cập vào NPC và không chứa hàm tạo No-arg - thì bạn có thể thêm một lớp 'giả mạo' vào phân cấp sẽ chọn đúng thứ bậc. Ví dụ.

class SomeClass extends NPC { 
// will be called during deserialization 
public SomeClass(){ 
// call custom constructor of NPC 
super(null); 
} 
} 

class Person extends SomeClass implements Serializable { 
// .. 
} 
+0

Điều đó đã làm được! Cảm ơn. – WildBamaBoy

2

mỗi this thread, họ không cần phải thực hiện Serializable, nhưng họ (hoặc tại một NPC tối thiểu vì các lớp đầu tiên của nó không serializable trong hệ thống cấp bậc) phải chứa một constructor 0-tham số. nếu không có các hàm tạo nào được định nghĩa trong các lớp, thì hàm khởi tạo ngầm là adaquate, nhưng nếu bạn có các hàm tạo khác được định nghĩa trong các lớp đó, bạn phải viết một hàm tạo 0 tham số rõ ràng.

Vì bạn không thể kiểm soát NPC, hãy thử tạo con của nó định nghĩa một hàm dựng 0-param rõ ràng nhưng điều đó không triển khai Serializable và xem liệu điều đó có làm được không.

0

Tôi phải đối mặt với cùng một vấn đề với số serial của Hazelcast, nhưng đã giải quyết nó mà không cần sử dụng đến lớp trung gian, bằng cách sử dụng serialization tùy chỉnh. Tôi đã thêm một hàm tạo no-arg rỗng vào lớp Động vật và đã triển khai lớp Person như sau:

class Person extends Animal implements Serializable { 

    private void writeObject(ObjectOutputStream o) throws IOException { 
     o.writeObject(this.fieldA); 
     o.writeObject(this.fieldB); 
     o.writeObject(this.fieldC); 
     ... 
    } 

    private void readObject(ObjectInputStream o) throws IOException, ClassNotFoundException { 
     this.fieldA = (TypeOfA) o.readObject(); 
     this.fieldB = (TypeOfB) o.readObject(); 
     this.fieldC = (TypeOfC) o.readObject(); 
     ... 
    } 
} 
Các vấn đề liên quan