Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8027681

Lambda serialization fails once reflection proxy generation kicks in

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P1 P1
    • 8
    • 8
    • core-libs

         Now that lambda proxies are anonymous, when we cross the threshold where reflection proxies are generated to invoke writeReplace, linkage of the reflection proxy fails with CFNE, causing serialization to fail:

        LambdaObject: org.openjdk.tests.java.util.stream.IntReduceTest$$Lambda$1004/961982062@69dd3352 [ 20 ]
           [testng] Throwable: java.lang.NoClassDefFoundError: org/openjdk/tests/java/util/stream/IntReduceTest$$Lambda$1004/961982062java.lang.NoClassDefFoundError: org/openjdk/tests/java/util/stream/IntReduceTest$$Lambda$1004/961982062
           [testng] at sun.reflect.GeneratedMethodAccessor273.invoke(Unknown Source)
           [testng] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
           [testng] at java.lang.reflect.Method.invoke(Method.java:483)
           [testng] at java.io.ObjectStreamClass.invokeWriteReplace(ObjectStreamClass.java:1075)
           [testng] at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1136)
           [testng] at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
           [testng] at com.oracle.lambda.TestLambdaSerialization.serializeAndDeserialize0(TestLambdaSerialization.java:128)

        Test patch to detect failures:

        diff -r f6bc96afc5d4 test/java/util/stream/test/org/openjdk/tests/java/lang/invoke/SerializedLambdaTest.java
        --- a/test/java/util/stream/test/org/openjdk/tests/java/lang/invoke/SerializedLambdaTest.java
        +++ b/test/java/util/stream/test/org/openjdk/tests/java/lang/invoke/SerializedLambdaTest.java
        @@ -45,15 +45,19 @@
          */
         @Test
         public class SerializedLambdaTest {
        + public static final int REPS = 50;
        +
             @SuppressWarnings("unchecked")
             private<T> void assertSerial(T p, Consumer<T> asserter) throws IOException, ClassNotFoundException {
                 asserter.accept(p);
         
        - byte[] bytes = serialize(p);
        + for (int i=0; i<REPS; i++) {
        + byte[] bytes = new byte[0];
        + bytes = serialize(p);
                 assertTrue(bytes.length > 0);
        -
                 asserter.accept((T) deserialize(bytes));
             }
        + }
         
             private void assertNotSerial(Predicate<String> p, Consumer<Predicate<String>> asserter)


              rfield Robert Field (Inactive)
              briangoetz Brian Goetz
              Votes:
              0 Vote for this issue
              Watchers:
              7 Start watching this issue

                Created:
                Updated:
                Resolved: