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/incubator-fury.git
The following commit(s) were added to refs/heads/main by this push:
new 4de16239 feat(java): support deserialization
ignoreEnumDeserializeError (#1623)
4de16239 is described below
commit 4de162393bc604ea915139117c6d27569820f498
Author: 157152688 <[email protected]>
AuthorDate: Sat May 11 13:35:56 2024 +0800
feat(java): support deserialization ignoreEnumDeserializeError (#1623)
<!--
**Thanks for contributing to Fury.**
**If this is your first time opening a PR on fury, you can refer to
[CONTRIBUTING.md](https://github.com/apache/incubator-fury/blob/main/CONTRIBUTING.md).**
Contribution Checklist
- The **Apache Fury (incubating)** community has restrictions on the
naming of pr titles. You can also find instructions in
[CONTRIBUTING.md](https://github.com/apache/incubator-fury/blob/main/CONTRIBUTING.md).
- Fury has a strong focus on performance. If the PR you submit will have
an impact on performance, please benchmark it first and provide the
benchmark result here.
-->
## What does this PR do?
<!-- Describe the purpose of this PR. -->
## Related issues
<!--
Is there any related issue? Please attach here.
- #xxxx0
- #xxxx1
- #xxxx2
-->
## Does this PR introduce any user-facing change?
<!--
If any user-facing interface changes, please [open an
issue](https://github.com/apache/incubator-fury/issues/new/choose)
describing the need to do so and update the document if necessary.
-->
- [x] Does this PR introduce any public API change?
- [x] Does this PR introduce any binary protocol compatibility change?
## Benchmark
<!--
When the PR has an impact on performance (if you don't know whether the
PR will have an impact on performance, you can submit the PR first, and
if it will have impact on performance, the code reviewer will explain
it), be sure to attach a benchmark data here.
-->
---------
Co-authored-by: weijiang.wj <[email protected]>
---
.../main/java/org/apache/fury/config/Config.java | 7 ++++++
.../java/org/apache/fury/config/FuryBuilder.java | 8 +++++++
.../org/apache/fury/serializer/EnumSerializer.java | 6 ++++-
.../apache/fury/serializer/EnumSerializerTest.java | 27 ++++++++++++++++++++++
4 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/java/fury-core/src/main/java/org/apache/fury/config/Config.java
b/java/fury-core/src/main/java/org/apache/fury/config/Config.java
index 476f7512..5fc79e93 100644
--- a/java/fury-core/src/main/java/org/apache/fury/config/Config.java
+++ b/java/fury-core/src/main/java/org/apache/fury/config/Config.java
@@ -54,6 +54,7 @@ public class Config implements Serializable {
private final boolean deserializeUnexistedClass;
private final boolean scalaOptimizationEnabled;
private transient int configHash;
+ private final boolean deserializeUnexistentEnumValueAsNull;
public Config(FuryBuilder builder) {
language = builder.language;
@@ -82,6 +83,7 @@ public class Config implements Serializable {
}
asyncCompilationEnabled = builder.asyncCompilationEnabled;
scalaOptimizationEnabled = builder.scalaOptimizationEnabled;
+ deserializeUnexistentEnumValueAsNull =
builder.deserializeUnexistentEnumValueAsNull;
}
public Language getLanguage() {
@@ -100,6 +102,11 @@ public class Config implements Serializable {
return stringRefIgnored;
}
+ /** ignore Enum Deserialize array out of bounds return null. */
+ public boolean deserializeUnexistentEnumValueAsNull() {
+ return deserializeUnexistentEnumValueAsNull;
+ }
+
/**
* Whether ignore reference tracking of all time types registered in {@link
TimeSerializers} and
* subclasses of those types when ref tracking is enabled.
diff --git
a/java/fury-core/src/main/java/org/apache/fury/config/FuryBuilder.java
b/java/fury-core/src/main/java/org/apache/fury/config/FuryBuilder.java
index 753f6613..3fe85695 100644
--- a/java/fury-core/src/main/java/org/apache/fury/config/FuryBuilder.java
+++ b/java/fury-core/src/main/java/org/apache/fury/config/FuryBuilder.java
@@ -75,6 +75,7 @@ public final class FuryBuilder {
boolean registerGuavaTypes = true;
boolean scalaOptimizationEnabled = false;
boolean suppressClassRegistrationWarnings = true;
+ boolean deserializeUnexistentEnumValueAsNull = false;
public FuryBuilder() {}
@@ -105,6 +106,13 @@ public final class FuryBuilder {
return this;
}
+ /** ignore Enum Deserialize array out of bounds. */
+ public FuryBuilder deserializeUnexistentEnumValueAsNull(
+ boolean deserializeUnexistentEnumValueAsNull) {
+ this.deserializeUnexistentEnumValueAsNull =
deserializeUnexistentEnumValueAsNull;
+ return this;
+ }
+
/**
* Whether ignore reference tracking of all time types registered in {@link
TimeSerializers} when
* ref tracking is enabled.
diff --git
a/java/fury-core/src/main/java/org/apache/fury/serializer/EnumSerializer.java
b/java/fury-core/src/main/java/org/apache/fury/serializer/EnumSerializer.java
index 634fffbe..24bbcdfb 100644
---
a/java/fury-core/src/main/java/org/apache/fury/serializer/EnumSerializer.java
+++
b/java/fury-core/src/main/java/org/apache/fury/serializer/EnumSerializer.java
@@ -48,6 +48,10 @@ public final class EnumSerializer extends Serializer<Enum> {
@Override
public Enum read(MemoryBuffer buffer) {
- return enumConstants[buffer.readVarUint32Small7()];
+ int value = buffer.readVarUint32Small7();
+ if (fury.getConfig().deserializeUnexistentEnumValueAsNull() && value >=
enumConstants.length) {
+ return null;
+ }
+ return enumConstants[value];
}
}
diff --git
a/java/fury-core/src/test/java/org/apache/fury/serializer/EnumSerializerTest.java
b/java/fury-core/src/test/java/org/apache/fury/serializer/EnumSerializerTest.java
index 2fc2768f..63ceef1f 100644
---
a/java/fury-core/src/test/java/org/apache/fury/serializer/EnumSerializerTest.java
+++
b/java/fury-core/src/test/java/org/apache/fury/serializer/EnumSerializerTest.java
@@ -23,6 +23,7 @@ import static org.testng.Assert.*;
import org.apache.fury.Fury;
import org.apache.fury.FuryTestBase;
+import org.apache.fury.codegen.JaninoUtils;
import org.apache.fury.config.FuryBuilder;
import org.apache.fury.config.Language;
import org.testng.annotations.Test;
@@ -66,4 +67,30 @@ public class EnumSerializerTest extends FuryTestBase {
assertEquals(
EnumSerializerTest.EnumSubClass.B, serDe(fury1, fury2,
EnumSerializerTest.EnumSubClass.B));
}
+
+ @Test()
+ public void testEnumSerializationUnexistentEnumValueAsNull() {
+ String enumCode2 = "enum TestEnum2 {" + " A;" + "}";
+ String enumCode1 = "enum TestEnum2 {" + " A, B" + "}";
+ Class<?> cls1 =
+ JaninoUtils.compileClass(getClass().getClassLoader(), "", "TestEnum2",
enumCode1);
+ Class<?> cls2 =
+ JaninoUtils.compileClass(getClass().getClassLoader(), "", "TestEnum2",
enumCode2);
+ FuryBuilder builderSerialization =
+ Fury.builder()
+ .withLanguage(Language.JAVA)
+ .withRefTracking(true)
+ .requireClassRegistration(false);
+ FuryBuilder builderDeserialize =
+ Fury.builder()
+ .withLanguage(Language.JAVA)
+ .withRefTracking(true)
+ .requireClassRegistration(false)
+ .deserializeUnexistentEnumValueAsNull(true)
+ .withClassLoader(cls2.getClassLoader());
+ Fury furyDeserialize = builderDeserialize.build();
+ Fury furySerialization = builderSerialization.build();
+ byte[] bytes = furySerialization.serialize(cls1.getEnumConstants()[1]);
+ Object data = furyDeserialize.deserialize(bytes);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]