Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > проблема с десериализацией


Автор: kamelopardus 22.12.2010, 11:09
Есть вот такой класс:

Код

public class SBufferedImage extends BufferedImage implements Serializable{  
  
    public SBufferedImage(int width, int height, int type){  
        super(width, height, type);  
    }  
  
    public  SBufferedImage(){  
        super(512, 480, SBufferedImage.TYPE_INT_RGB);  
    }  
  
}


Объект сериализуется, сохраняется. Затем пытаюсь десериализовать его:

Код

ByteArrayInputStream bais = new ByteArrayInputStream(this.img);  
ObjectInputStream in = new ObjectInputStream(bais);  
image = (SBufferedImage)in.readObject();


а мне в ответ вот это: "java.io.InvalidClassException: SBufferedImage; SBufferedImage; no valid constructor".  Обычно он так ругается на отсутствие дефолтного конструктора, но в данном случае-то он есть. 

Автор: LSD 22.12.2010, 11:50
http://download.oracle.com/javase/1.4.2/docs/api/java/io/Serializable.html
Цитата
To allow subtypes of non-serializable classes to be serialized, the subtype may assume responsibility for saving and restoring the state of the supertype's public, protected, and (if accessible) package fields. The subtype may assume this responsibility only if the class it extends has an accessible no-arg constructor to initialize the class's state. It is an error to declare a class Serializable if this is not the case. The error will be detected at runtime.


Попробуй для начала реализовать у SBufferedImage методы:
Код

private void writeObject(java.io.ObjectOutputStream out) throws IOException

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;

А если не поможет, то Externalizable.

Автор: Skipy 22.12.2010, 12:20
kamelopardus, вопрос на засыпку. Как инициализируется при десериализации родительский класс, который не является сериализуемым?

http://www.skipy.ru/technics/serialization.html

Автор: kamelopardus 22.12.2010, 13:54
Спасибо за подсказки!
 В итоге  ImageIO  решил все мои проблемы.

Автор: Skipy 22.12.2010, 14:53
Э-э-э... Так это Вы пытались изображение таким образом сохранять?? Оригинально!

Автор: kamelopardus 22.12.2010, 15:35
Skipy, согласитесь, что было бы странно, если бы класс, унаследованный от BufferedImage был не изображением=) 
А то, что я над изображениями такие операции поначалу решил производить - так это от неопытности, строго не судите. У меня за плечами всего 3 дня программирования на Java...

Автор: Skipy 23.12.2010, 14:08
Цитата(kamelopardus @ 22.12.2010,  15:35)
Skipy, согласитесь, что было бы странно, если бы класс, унаследованный от BufferedImage был не изображением=) 

Хорошо, что Вы это понимаете. А то некоторые наследуют танк от пулемета потому что, во-первых, им так удобно, во-вторых, у танка есть пулемет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)