You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Gary D. Gregory (Jira)" <ji...@apache.org> on 2024/12/06 12:48:00 UTC

[jira] [Resolved] (LANG-1759) SerializationUtils.clone(Object) throws ClassCastException when called with a Serializable lambda

     [ https://issues.apache.org/jira/browse/LANG-1759?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Gary D. Gregory resolved LANG-1759.
-----------------------------------
    Fix Version/s: 3.18.0
       Resolution: Fixed

Hello [~maxim_butov] 

Thank you for your report.

This is now fixed in git master and snapshot builds in https://repository.apache.org/content/repositories/snapshots/

Please review.

See also {{{}SerializationUtilsTest.testCloneSerializableSupplier(){}}}.

 

> SerializationUtils.clone(Object) throws ClassCastException when called with a Serializable lambda
> -------------------------------------------------------------------------------------------------
>
>                 Key: LANG-1759
>                 URL: https://issues.apache.org/jira/browse/LANG-1759
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.*
>    Affects Versions: 3.17.0
>         Environment: Linux
> OpenJDK Runtime Environment Temurin-17.0.8.1+1 (build 17.0.8.1+1)
>            Reporter: Maxim Butov
>            Assignee: Gary D. Gregory
>            Priority: Major
>             Fix For: 3.18.0
>
>
> SerializationUtils does not clone serializable lambda.
> {code:java}
> import java.io.Serializable;
> import java.util.function.Supplier;
> import org.junit.jupiter.api.Test;
> import static org.junit.jupiter.api.Assertions.assertEquals;
> public class SerializationUtilsTest {
>     interface SerializableSupplier<T> extends Supplier<T>, Serializable {
>     }
>     @Test
>     void testCloneLambda() {
>         SerializableSupplier<String> supplier = () -> "test";
>         assertEquals("test", supplier.get());
>         // next lines works fine
>         SerializableSupplier<String> springClone = org.springframework.util.SerializationUtils.clone(supplier);
>         assertEquals("test", springClone.get());
>         // line below produces an error
>         SerializableSupplier<String> commonsClone = org.apache.commons.lang3.SerializationUtils.clone(supplier);
>         assertEquals("test", commonsClone.get());
>     }
> }
> {code}
> Got an exception
> {noformat}
> Cannot cast SerializationUtilsTest$$Lambda/0x00007f6ec8142940 to SerializationUtilsTest$$Lambda/0x00007f6ec8141ca0
> java.lang.ClassCastException: Cannot cast SerializationUtilsTest$$Lambda/0x00007f6ec8142940 to SerializationUtilsTest$$Lambda/0x00007f6ec8141ca0
> 	at java.base/java.lang.Class.cast(Class.java:4067)
> 	at org.apache.commons.lang3.SerializationUtils.clone(SerializationUtils.java:132)
> 	at SerializationUtilsTest.testCloneLambda(SerializationUtilsTest.java:24)
> 	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
> 	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
> 	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)