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 d73f4f8f6 fix(java): support serialization of CopyOnWriteArraySet 
(#2999)
d73f4f8f6 is described below

commit d73f4f8f67bdb23659e2c510fcfb65368992ffd8
Author: LiangliangSui <[email protected]>
AuthorDate: Mon Dec 8 15:51:37 2025 +0800

    fix(java): support serialization of CopyOnWriteArraySet (#2999)
    
    ## Why?
    
    
    
    ## What does this PR do?
    
    
    
    Support serialization of CopyOnWriteArraySet
    
    ## Related issues
    
    
    https://github.com/apache/fory/issues/2918
    
    ## Does this PR introduce any user-facing change?
    
    
    
    - [ ] Does this PR introduce any public API change?
    - [ ] Does this PR introduce any binary protocol compatibility change?
    
    ## Benchmark
    
    ---------
    
    Signed-off-by: Liangliang Sui <[email protected]>
    Co-authored-by: Shawn Yang <[email protected]>
---
 .../collection/CollectionSerializers.java          | 49 ++++++++++++++++++++++
 .../fory-core/native-image.properties              |  2 +
 .../collection/CollectionSerializersTest.java      | 18 ++++++++
 3 files changed, 69 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 709ea6474..2aae03677 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
@@ -46,6 +46,7 @@ import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.LinkedBlockingQueue;
 import org.apache.fory.Fory;
 import org.apache.fory.collection.CollectionSnapshot;
@@ -292,6 +293,51 @@ public class CollectionSerializers {
       Object[] elements = ((CollectionContainer) collection).elements;
       return new CopyOnWriteArrayList(elements);
     }
+
+    @Override
+    public CopyOnWriteArrayList copy(CopyOnWriteArrayList originCollection) {
+      CopyOnWriteArrayList newCollection = new CopyOnWriteArrayList();
+      if (needToCopyRef) {
+        fory.reference(originCollection, newCollection);
+      }
+      List copyList = new ArrayList(originCollection.size());
+      copyElements(originCollection, copyList);
+      newCollection.addAll(copyList);
+      return newCollection;
+    }
+  }
+
+  public static class CopyOnWriteArraySetSerializer
+      extends ConcurrentCollectionSerializer<CopyOnWriteArraySet> {
+
+    public CopyOnWriteArraySetSerializer(Fory fory, Class<CopyOnWriteArraySet> 
type) {
+      super(fory, type, true);
+    }
+
+    @Override
+    public Collection newCollection(MemoryBuffer buffer) {
+      int numElements = buffer.readVarUint32Small7();
+      setNumElements(numElements);
+      return new CollectionContainer<>(numElements);
+    }
+
+    @Override
+    public CopyOnWriteArraySet onCollectionRead(Collection collection) {
+      Object[] elements = ((CollectionContainer) collection).elements;
+      return new CopyOnWriteArraySet(Arrays.asList(elements));
+    }
+
+    @Override
+    public CopyOnWriteArraySet copy(CopyOnWriteArraySet originCollection) {
+      CopyOnWriteArraySet newCollection = new CopyOnWriteArraySet();
+      if (needToCopyRef) {
+        fory.reference(originCollection, newCollection);
+      }
+      List copyList = new ArrayList(originCollection.size());
+      copyElements(originCollection, copyList);
+      newCollection.addAll(copyList);
+      return newCollection;
+    }
   }
 
   public static final class EmptySetSerializer extends 
CollectionSerializer<Set<?>> {
@@ -1004,5 +1050,8 @@ public class CollectionSerializers {
     resolver.registerSerializer(
         ConcurrentHashMap.KeySetView.class,
         new ConcurrentHashMapKeySetViewSerializer(fory, 
ConcurrentHashMap.KeySetView.class));
+    resolver.registerSerializer(
+        CopyOnWriteArraySet.class,
+        new CopyOnWriteArraySetSerializer(fory, CopyOnWriteArraySet.class));
   }
 }
diff --git 
a/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
 
b/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
index fabf1ddd1..02554226b 100644
--- 
a/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
+++ 
b/java/fory-core/src/main/resources/META-INF/native-image/org.apache.fory/fory-core/native-image.properties
@@ -182,6 +182,7 @@ 
Args=--initialize-at-build-time=org.apache.fory.memory.MemoryBuffer,\
     java.util.concurrent.ConcurrentSkipListMap,\
     java.util.concurrent.ConcurrentSkipListSet,\
     java.util.concurrent.CopyOnWriteArrayList,\
+    java.util.concurrent.CopyOnWriteArraySet,\
     java.util.concurrent.LinkedBlockingQueue,\
     java.util.concurrent.atomic.AtomicBoolean,\
     java.util.concurrent.atomic.AtomicInteger,\
@@ -397,6 +398,7 @@ 
Args=--initialize-at-build-time=org.apache.fory.memory.MemoryBuffer,\
     
org.apache.fory.serializer.collection.CollectionSerializers$ConcurrentHashMapKeySetViewSerializer,\
     
org.apache.fory.serializer.collection.CollectionSerializers$ConcurrentSkipListSetSerializer,\
     
org.apache.fory.serializer.collection.CollectionSerializers$CopyOnWriteArrayListSerializer,\
+    
org.apache.fory.serializer.collection.CollectionSerializers$CopyOnWriteArraySetSerializer,\
     
org.apache.fory.serializer.collection.CollectionSerializers$EmptyListSerializer,\
     
org.apache.fory.serializer.collection.CollectionSerializers$EmptySetSerializer,\
     
org.apache.fory.serializer.collection.CollectionSerializers$EmptySortedSetSerializer,\
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 552f631a7..59f12386f 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
@@ -56,6 +56,7 @@ import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.LongStream;
@@ -968,4 +969,21 @@ public class CollectionSerializersTest extends 
ForyTestBase {
             .build();
     serDeCheck(fory, obj);
   }
+
+  @Test
+  public void testCopyOnWriteArraySet() {
+    final CopyOnWriteArraySet<String> set =
+        new CopyOnWriteArraySet<>(Arrays.asList("Value1", "Value2"));
+    Assert.assertEquals(set, serDe(getJavaFory(), set));
+    Assert.assertEquals(
+        
getJavaFory().getClassResolver().getSerializerClass(CopyOnWriteArraySet.class),
+        CollectionSerializers.CopyOnWriteArraySetSerializer.class);
+  }
+
+  @Test(dataProvider = "foryCopyConfig")
+  public void testCopyOnWriteArraySet(Fory fory) {
+    final CopyOnWriteArraySet<Object> set =
+        new CopyOnWriteArraySet<>(Arrays.asList("a", "b", 
Cyclic.create(true)));
+    copyCheck(fory, set);
+  }
 }


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

Reply via email to