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 75dcd7ad fix(java): fix row format handling Optional of type with
custom codec (#2321)
75dcd7ad is described below
commit 75dcd7ad1b202320e049f99b4816d52c50d96b48
Author: Steven Schlansker <[email protected]>
AuthorDate: Mon Jun 9 23:53:29 2025 -0700
fix(java): fix row format handling Optional of type with custom codec
(#2321)
## What does this PR do?
Fix the logic for type with custom codec wrapped in Optional, currently
causes compile error
Please review #2320 first; this PR depends on that fix
And please consider for a 0.11.0-rc2 if that happens, otherwise 0.11.1
---
.../format/encoder/BaseBinaryEncoderBuilder.java | 1 -
.../fory/format/encoder/RowEncoderBuilder.java | 14 +++----
.../format/encoder/ImplementInterfaceTest.java | 43 ++++++++++++++++++++++
3 files changed, 49 insertions(+), 9 deletions(-)
diff --git
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/BaseBinaryEncoderBuilder.java
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/BaseBinaryEncoderBuilder.java
index 332a2bcc..7ff21902 100644
---
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/BaseBinaryEncoderBuilder.java
+++
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/BaseBinaryEncoderBuilder.java
@@ -536,7 +536,6 @@ public abstract class BaseBinaryEncoderBuilder extends
CodecBuilder {
Set<TypeRef<?>> visitedCustomTypes) {
Class<?> rawType = getRawType(typeRef);
TypeRef<?> rewrittenType =
customTypeHandler.replacementTypeFor(beanType.getRawType(), rawType);
- ;
if (rewrittenType != null
&& !visitedCustomTypes.contains(typeRef)
&& !typeRef.equals(rewrittenType)) {
diff --git
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/RowEncoderBuilder.java
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/RowEncoderBuilder.java
index ac9118c8..7c3a581b 100644
---
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/RowEncoderBuilder.java
+++
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/RowEncoderBuilder.java
@@ -286,16 +286,14 @@ public class RowEncoderBuilder extends
BaseBinaryEncoderBuilder {
Descriptor d =
getDescriptorByFieldName(schema.getFields().get(i).getName());
TypeRef<?> fieldType = d.getTypeRef();
Class<?> rawFieldType = fieldType.getRawType();
- TypeRef<?> columnAccessType;
+ TypeRef<?> columnAccessType = fieldType;
if (rawFieldType == Optional.class) {
columnAccessType = TypeUtils.getTypeArguments(fieldType).get(0);
- } else {
- CustomCodec<?, ?> customEncoder =
customTypeHandler.findCodec(beanClass, rawFieldType);
- if (customEncoder == null) {
- columnAccessType = fieldType;
- } else {
- columnAccessType = customEncoder.encodedType();
- }
+ }
+ TypeRef<?> replacementType =
+ customTypeHandler.replacementTypeFor(beanClass,
columnAccessType.getRawType());
+ if (replacementType != null) {
+ columnAccessType = replacementType;
}
String columnAccessMethodName =
BinaryUtils.getElemAccessMethodName(columnAccessType, typeCtx);
diff --git
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/ImplementInterfaceTest.java
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/ImplementInterfaceTest.java
index 40fec4e6..c174748a 100644
---
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/ImplementInterfaceTest.java
+++
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/ImplementInterfaceTest.java
@@ -75,6 +75,7 @@ public class ImplementInterfaceTest {
static {
Encoders.registerCustomCodec(PoisonPill.class, new PoisonPillCodec());
+ Encoders.registerCustomCodec(Id.class, new IdCodec());
}
@Test
@@ -168,4 +169,46 @@ public class ImplementInterfaceTest {
final OptionalType deserializedBean = encoder.fromRow(row);
Assert.assertEquals(deserializedBean.f1(), Optional.of("42"));
}
+
+ public static class Id<T> {
+ byte id;
+
+ Id(final byte id) {
+ this.id = id;
+ }
+ }
+
+ public interface OptionalCustomType {
+ Optional<Id<OptionalCustomType>> f1();
+ }
+
+ static class OptionalCustomTypeImpl implements OptionalCustomType {
+ @Override
+ public Optional<Id<OptionalCustomType>> f1() {
+ return Optional.of(new Id<>((byte) 42));
+ }
+ }
+
+ static class IdCodec<T> implements CustomCodec.MemoryBufferCodec<Id<T>> {
+ @Override
+ public MemoryBuffer encode(final Id<T> value) {
+ return MemoryBuffer.fromByteArray(new byte[] {value.id});
+ }
+
+ @Override
+ public Id<T> decode(final MemoryBuffer value) {
+ return new Id<>(value.readByte());
+ }
+ }
+
+ @Test
+ public void testOptionalCustomType() {
+ final OptionalCustomType bean1 = new OptionalCustomTypeImpl();
+ final RowEncoder<OptionalCustomType> encoder =
Encoders.bean(OptionalCustomType.class);
+ final BinaryRow row = encoder.toRow(bean1);
+ final MemoryBuffer buffer = MemoryUtils.wrap(row.toBytes());
+ row.pointTo(buffer, 0, buffer.size());
+ final OptionalCustomType deserializedBean = encoder.fromRow(row);
+ Assert.assertEquals(deserializedBean.f1().get().id, bean1.f1().get().id);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]