It is an Eclipse bug, not a JDK one. javac works fine.

But I haven't submitted it to Eclipse... yet? :)
“The truth is rarely pure and never simple.” ― Oscar Wilde


On Sun, May 25, 2014 at 2:55 PM, Martin Grigorov <[email protected]> wrote:
> Thanks for sharing your findings!
>
> What is the id of the bug at Oracle ? Just for reference
>
> Martin Grigorov
> Wicket Training and Consulting
>
>
> On Fri, May 23, 2014 at 11:48 PM, tetsuo <[email protected]> wrote:
>
>> Never mind, Eclipse bug (sigh)
>> “The truth is rarely pure and never simple.” ― Oscar Wilde
>>
>>
>> On Fri, May 23, 2014 at 4:38 PM, tetsuo <[email protected]> wrote:
>> > I'm using Java 8 lambdas with Wicket, and they make it really simple
>> > to have almost 100% type-safe code, without the verbosity of anonymous
>> > inner classes. With a few adapter classes and interfaces, it was
>> > relatively easy to integrate them.
>> >
>> > But I'm having some non-trivial problems with serialization. I think
>> > it's a bug in the compiler, but I'm curious if someone else has seen
>> > this:
>> >
>> >
>> > public class TestClass implements Serializable {
>> >     String               msg = "HEY!";
>> >     SerializableRunnable runnable;
>> >     public TestClass() {
>> >         TestClass self = this;
>> >         runnable = () -> self.say();  // uses a local copy of 'this'
>> >        // runnable = () -> this.say(); // uses 'this' directly
>> >     }
>> >     public void say() {
>> >         System.out.println(msg);
>> >     }
>> >     public static void main(String[] args) throws Exception {
>> >         ByteArrayOutputStream buffer = new ByteArrayOutputStream();
>> >         try (ObjectOutputStream out = new ObjectOutputStream(buffer)) {
>> >             out.writeObject(new TestClass());
>> >         }
>> >         try (ObjectInputStream in = new ObjectInputStream(new
>> > ByteArrayInputStream(buffer.toByteArray()))) {
>> >             TestClass s = (TestClass) in.readObject();
>> >             s.say();
>> >         }
>> >     }
>> > }
>> > interface SerializableRunnable extends Runnable, Serializable {
>> > }
>> >
>> >
>> > The above code runs fine, but if I use the commented line to
>> > initialize the runnable (using 'this' directly instead of a local
>> > variable), the in.readObject() call throws an excetion
>> > ('java.lang.IllegalArgumentException: Invalid lambda
>> > deserialization'). The object is serialized, but can't be
>> > deserialized.
>> >
>> > That is, lambdas are correctly serialized when it only uses the local
>> > scope, but if it tries to use the enclosing class directly (methods or
>> > attributes), it fails. I mean, it compiles, it works, it can access
>> > them, but if serialized, it can't be deserialized.
>> >
>> > Obviously, it makes it very inconvenient to use with Wicket, which
>> > uses serialization extensively.
>> >
>> > I already submited a bug to Oracle. Do you agree that it looks like a
>> bug?
>>

Reply via email to