[ https://issues.apache.org/jira/browse/GROOVY-11272?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17804365#comment-17804365 ]
Daniel Sun commented on GROOVY-11272: ------------------------------------- {quote} Closure itself provides serialVersionUID. {quote} True. But {{Closure}} subclasses including the generated closures can not derive their parent class's {{serialVersionUID}}, which is {{private}}. Here is a case to show why I propose to generate {{serialVersionUID}} for each closure: [https://github.com/apache/groovy/actions/runs/7303097289/job/19910219335#step:6:193] {code:java} Error: Exception in thread "main" java.io.InvalidClassException: precompiled_OrgApacheGroovyAsciidoctor$_run_closure5$_closure20; local class incompatible: stream classdesc serialVersionUID = 4477335110646737576, local class serialVersionUID = -4624195846785189806 at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:597) at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2051) at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1898) at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2224) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:509) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:467) at java.base/java.util.ArrayList.readObject(ArrayList.java:899) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1100) at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2423) at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2257) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733) at java.base/java.io.ObjectInputStream$FieldValues.<init>(ObjectInputStream.java:2606) at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2457) at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2257) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:509) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:467) at java.base/java.util.ArrayList.readObject(ArrayList.java:899) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1100) at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2423) at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2257) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733) at java.base/java.io.ObjectInputStream$FieldValues.<init>(ObjectInputStream.java:2606) at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2457) at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2257) at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:509) at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:467) at org.asciidoctor.gradle.remote.AsciidoctorJavaExec$_main_closure1$_closure7.doCall(AsciidoctorJavaExec.groovy:45) at org.asciidoctor.gradle.remote.AsciidoctorJavaExec$_main_closure1$_closure7.call(AsciidoctorJavaExec.groovy) at org.codehaus.groovy.runtime.IOGroovyMethods.withCloseable(IOGroovyMethods.java:1607) at org.asciidoctor.gradle.remote.AsciidoctorJavaExec$_main_closure1.doCall(AsciidoctorJavaExec.groovy:44) at org.asciidoctor.gradle.remote.AsciidoctorJavaExec$_main_closure1.call(AsciidoctorJavaExec.groovy) at org.codehaus.groovy.runtime.IOGroovyMethods.withStream(IOGroovyMethods.java:1184) at org.codehaus.groovy.runtime.ResourceGroovyMethods.withInputStream(ResourceGroovyMethods.java:1882) at org.asciidoctor.gradle.remote.AsciidoctorJavaExec.main(AsciidoctorJavaExec.groovy:43) > Task :groovy-ant:asciidoctor FAILED {code} > Generate `serialVersionUID` for each closure > -------------------------------------------- > > Key: GROOVY-11272 > URL: https://issues.apache.org/jira/browse/GROOVY-11272 > Project: Groovy > Issue Type: Improvement > Reporter: Daniel Sun > Priority: Major > Fix For: 5.x > > > Though {{Closure}} implements {{Serializable}}, but generated closures have > not {{serialVersionUID}}, which may cause serialization issue, so it's better > to generate {{serialVersionUID}} field for each closure. -- This message was sent by Atlassian Jira (v8.20.10#820010)