Sorry to hijack your discussion, I just want to say that even if you keep the serialization magic, adding warning/ error logs when such references are found, at least in the development configuration, would be a big plus, because these references not only may cause problems in wicket core code, they can lead to headaches anywhere.
Martin 2009/3/3 Johan Compagner <jcompag...@gmail.com>: > I dont think we can get rid of it all. > We need checking because what if i do this > > MyModelInnerClassPageA model = new MyModelInnerClassPageA() > PageB b = new PageB(model) > > This is ofcourse a simple example but there are all kind of variants. > > So if we remove it and dont log big warnings/errors this could result > in way more strange results... > > On 03/03/2009, Matej Knopp <matej.kn...@gmail.com> wrote: >> The problem of course are explicit page references. Actually, it is >> the code in wicket that makes it possible to use page references. It's >> *huge* pain to maintain and it still doesn't work flawlessly (and >> never will). Anonymous classes are only tip of iceberg. >> >> Also, if we get rid of all the magic code, anonymous references will >> work. Because they will be normally serialized with the outermost >> page. It will not be ideal performance wise and it's a bad practice, >> but it will not cause stack overflow. >> >> -Matej >> >> On Tue, Mar 3, 2009 at 12:01 AM, Martijn Dashorst >> <martijn.dasho...@gmail.com> wrote: >>> The problem is not IMO the page reference that gets passed in >>> explicitly, but those anonymous references to the surrounding >>> page/component that are the cause of subtle bugs. The problem is that >>> you won't get rid of those references with this solution... >>> >>> Martijn >>> >>> On Mon, Mar 2, 2009 at 11:38 PM, Matej Knopp <matej.kn...@gmail.com> >>> wrote: >>>> Hi, >>>> >>>> more perceptive people have probably noticed that there is some really >>>> obscure page serialization related code in Wicket. What it is supposed >>>> to do is to make sure that when PageA holds reference to pageB, pageA >>>> and pageB get serialized separately and when pageA is deserialized, >>>> pageB is loaded also separately. So that the two pages would not be >>>> serialized in one piece. >>>> >>>> Unfortunately this is not as simple as it sounds, because pageB can >>>> hold reference to pageC which in turn can have an object that is >>>> anonymous class from pageA, so we need to deal with circular >>>> references, implicit references and lot of other nasty things. The >>>> bottom line is, this causes many weird serialization related bugs that >>>> are extremely difficult to fix. The code is also big pain to maintain. >>>> >>>> Simply put, passing references between pages and page serialization >>>> don't mix nicely. We need page serialization because it really helps >>>> scalability and memory consumption so I think it might be time to >>>> "deprecate" page references. >>>> >>>> Of course there would be a simple alternative. >>>> >>>> I.e. instead of >>>> >>>> class PageA ... >>>> { >>>> ... >>>> public void doSomething() { >>>> setResponsePage(new PageB(this)); >>>> } >>>> } >>>> >>>> it would be >>>> >>>> class PageA ... >>>> { >>>> ... >>>> public void doSomething() { >>>> setResponsePage(new PageB(this.getReference())); >>>> } >>>> } >>>> >>>> and >>>> >>>> class PageB ... >>>> { >>>> public PageB(final PageReference<PageA> pageA) >>>> { >>>> // to get the actual instance if you need it >>>> PageA a = pageA.get(); >>>> >>>> // or use the reference directly >>>> add(new PageLink("back", pageA); >>>> >>>> // or even like this >>>> add(new Link("back2") { public void onClick() { >>>> getRequestCycle().setResponsePage(pageA) } }); >>>> } >>>> } >>>> >>>> Also this would help the performance, because if PageB only uses pageA >>>> to return back (which is IMHO the most common case) it would only >>>> require tiny PageReference object instead of entire page. >>>> >>>> -Matej >>>> >>> >>> >>> >>> -- >>> Become a Wicket expert, learn from the best: http://wicketinaction.com >>> Apache Wicket 1.3.5 is released >>> Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.3. >>> >> >