This could only work if BufferedImage itself had a no-arg constructor.
It is it the first non-serializable class in the hierarchy that needs to
have it,
not the first serializable one, like in your example.
Besides, you would still lose all data stored in the BufferedImage's fields
(i.e.
the image stored in it).


On Mon, May 13, 2013 at 7:15 PM, smallufo <small...@gmail.com> wrote:

> Today I encountered one famous deserialization problem :
> InvalidClassException : no valid constructor
>
> I googled and found some solution , but all are in-vain.
> The solution says the first non-serializable super class should define a
> no-arg constructor.
>
> But I try to define a no-arg constructor to EACH class of the HIERARCHY ,
> and EACH class implements Serializable... (which is not necessary , but I
> want to make it simple , to pinpoint the problem)
>
> My base class is an abstract class extends BufferedImage (java 2D)
> while BufferedImage is not Serializable
> So I make my abstract class implements Serializable and define a no-arg
> default constructor.
>
> The total hierarchy is :
> public abstract class AbstractChart extends BufferedImage implements
> Serializable {
>   public AbstractChart()  {        // I try to remove this constructor ,
> but in vain
>     super(0 , 0, TYPE_INT_ARGB);
>   }
> }
>
> and first child class :
>
> public class ChildChart extends AbstractChart implements Serializable {
>   public ChildChart() {
>     super(); // or not calling super()
>   }
> }
>
> and the grandson class :
>
> public class GrandsonChart extends ChildChart implements Serializable {
>   public GrandsonChart() {
>     super(); // or not calling super()
>   }
> }
>
> No matter I calls super() in ChildChart or GrandsonChart ,
>
> Caused by: java.io.InvalidClassException: foobar.GrandsonChart; no valid
> constructor
>
> It happens when I click a button ,use ajax to paint this GrandsonChart ,
> and click another page , and use browser back .
> The browser will be redirected to /context/wicket/page?xxx (The error page)
> The screen shows :
> Could not deserialize object using:
> class
>
> org.apache.wicket.serialize.java.JavaSerializer$ClassResolverObjectInputStream
>
> and in the console log , I can see this InvalidClassException is thrown.
>
> Any way to solve this problem ?
> (I've already added default no-arg constructor , and make each class
> implements Serializable , but still not working )
>
> environment :
> Wicket version : 6.7
> Resin 4.0.25
> Java HotSpot(TM) 64-Bit Server VM 20.4-b02-402, 64, mixed mode, Apple Inc
> (It happens on Linux JDK too)
>

Reply via email to