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]