This is an automated email from the ASF dual-hosted git repository.

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory.git


The following commit(s) were added to refs/heads/main by this push:
     new 65cd46fa2 fix(java): Fix EnumSetSerializer for enums with overriding 
methods (#3315)
65cd46fa2 is described below

commit 65cd46fa2be4332f1fd0c31ead3564026b6d8227
Author: Artemiy <[email protected]>
AuthorDate: Mon Feb 9 14:45:18 2026 +0100

    fix(java): Fix EnumSetSerializer for enums with overriding methods (#3315)
    
    ## Why?
    
    Fix `EnumSetSerializers` for enums that have overriding methods in
    vairants:
    
    ```java
      enum TestEnumWithMethods {
        A {
          @Override
          public void foo() {
              System.out.println("A");
          }
        },
        B,
        C {
          @Override
          public void foo() {
          }
        },
        D;
    
        public void foo() {
            System.out.println("default");
        }
      }
    ```
    
    ## What does this PR do?
    
    `EnumSetSerializer` now correctly unwraps types of variants that extend
    base enum type. Doing it this way instead of writing class of variant
    and unwrapping it in read prevents writing additional classes for enum
    variants.
    
    ## Related issues
    
    - Fixes #3306
    
    ## Does this PR introduce any user-facing change?
    
    
    
    - [ ] Does this PR introduce any public API change?
    - [x] Does this PR introduce any binary protocol compatibility change?
    
    This PR changes class of contained enum that `EnumSetSerializer` writes.
    Instead of writing class of enum variant if this variant extends base
    enum class it always writes class of base enum. This however does not
    break any existing code since previously `EnumSet`s of classes with
    overriding methods could not be deserialized at all
    
    ## Benchmark
---
 .../collection/CollectionSerializers.java          |  3 +++
 .../collection/CollectionSerializersTest.java      | 29 ++++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git 
a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionSerializers.java
 
b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionSerializers.java
index 6b5c368dc..25eb5a615 100644
--- 
a/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionSerializers.java
+++ 
b/java/fory-core/src/main/java/org/apache/fory/serializer/collection/CollectionSerializers.java
@@ -658,6 +658,9 @@ public class CollectionSerializers {
       } else {
         elemClass = object.iterator().next().getClass();
       }
+      if (!elemClass.isEnum()) {
+        elemClass = elemClass.getEnclosingClass();
+      }
       fory.getClassResolver().writeClassAndUpdateCache(buffer, elemClass);
       Serializer serializer = fory.getClassResolver().getSerializer(elemClass);
       buffer.writeVarUint32Small7(object.size());
diff --git 
a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/CollectionSerializersTest.java
 
b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/CollectionSerializersTest.java
index 607f1087a..12b8d9a4a 100644
--- 
a/java/fory-core/src/test/java/org/apache/fory/serializer/collection/CollectionSerializersTest.java
+++ 
b/java/fory-core/src/test/java/org/apache/fory/serializer/collection/CollectionSerializersTest.java
@@ -343,6 +343,35 @@ public class CollectionSerializersTest extends 
ForyTestBase {
     copyCheck(fory, EnumSet.of(TestEnum.A, TestEnum.B));
   }
 
+  enum TestEnumWithMethods {
+    A {
+      @Override
+      public void foo() {
+        System.out.println("A");
+      }
+    },
+    B,
+    C {
+      @Override
+      public void foo() {}
+    },
+    D;
+
+    public void foo() {
+      System.out.println("default");
+    }
+  }
+
+  @Test
+  public void tesEnumSetSerializerWithMethods() {
+    serDe(getJavaFory(), EnumSet.noneOf(TestEnumWithMethods.class));
+    serDe(getJavaFory(), EnumSet.of(TestEnumWithMethods.A));
+    serDe(getJavaFory(), EnumSet.of(TestEnumWithMethods.B));
+    serDe(getJavaFory(), EnumSet.of(TestEnumWithMethods.A, 
TestEnumWithMethods.B));
+    serDe(getJavaFory(), EnumSet.of(TestEnumWithMethods.A, 
TestEnumWithMethods.C));
+    serDe(getJavaFory(), EnumSet.allOf(TestEnumWithMethods.class));
+  }
+
   @Test
   public void tesBitSetSerializer() {
     serDe(getJavaFory(), BitSet.valueOf(LongStream.range(0, 2).toArray()));


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to