[ 
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)

Reply via email to