diff --git a/java/fury-core/src/main/java/io/fury/Fury.java b/java/fury-core/src/main/java/io/fury/Fury.java index 842e337855..9a9032c5b4 100644 --- a/java/fury-core/src/main/java/io/fury/Fury.java +++ b/java/fury-core/src/main/java/io/fury/Fury.java @@ -538,6 +538,59 @@ public MemoryBuffer readBufferObject(MemoryBuffer buffer) { } } + public void writeString(MemoryBuffer buffer, String str) { + stringSerializer.writeString(buffer, str); + } + + public String readString(MemoryBuffer buffer) { + return stringSerializer.readString(buffer); + } + + public void writeJavaStringRef(MemoryBuffer buffer, String str) { + if (stringSerializer.needToWriteReference()) { + if (!referenceResolver.writeReferenceOrNull(buffer, str)) { + stringSerializer.writeJavaString(buffer, str); + } + } else { + if (str == null) { + buffer.writeByte(Fury.NULL_FLAG); + } else { + buffer.writeByte(Fury.NOT_NULL_VALUE_FLAG); + stringSerializer.write(buffer, str); + } + } + } + + public String readJavaStringRef(MemoryBuffer buffer) { + ReferenceResolver referenceResolver = this.referenceResolver; + if (stringSerializer.needToWriteReference()) { + String obj; + int nextReadRefId = referenceResolver.tryPreserveReferenceId(buffer); + if (nextReadRefId >= NOT_NULL_VALUE_FLAG) { + obj = stringSerializer.read(buffer); + referenceResolver.setReadObject(nextReadRefId, obj); + return obj; + } else { + return (String) referenceResolver.getReadObject(); + } + } else { + byte headFlag = buffer.readByte(); + if (headFlag == Fury.NULL_FLAG) { + return null; + } else { + return stringSerializer.read(buffer); + } + } + } + + public void writeJavaString(MemoryBuffer buffer, String str) { + stringSerializer.writeJavaString(buffer, str); + } + + public String readJavaString(MemoryBuffer buffer) { + return stringSerializer.readJavaString(buffer); + } + /** Deserialize obj from a byte array. */ public Object deserialize(byte[] bytes) { return deserializeInternal(MemoryUtils.wrap(bytes), null); diff --git a/java/fury-core/src/main/java/io/fury/serializer/Serializers.java b/java/fury-core/src/main/java/io/fury/serializer/Serializers.java index 6d95ce4e9e..84b7415822 100644 --- a/java/fury-core/src/main/java/io/fury/serializer/Serializers.java +++ b/java/fury-core/src/main/java/io/fury/serializer/Serializers.java @@ -29,6 +29,7 @@ import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Currency; import java.util.IdentityHashMap; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -558,6 +559,23 @@ public AtomicReference read(MemoryBuffer buffer) { } } + public static final class CurrencySerializer extends Serializer { + public CurrencySerializer(Fury fury) { + super(fury, Currency.class); + } + + @Override + public void write(MemoryBuffer buffer, Currency object) { + fury.writeJavaString(buffer, object.getCurrencyCode()); + } + + @Override + public Currency read(MemoryBuffer buffer) { + String currencyCode = fury.readJavaString(buffer); + return Currency.getInstance(currencyCode); + } + } + public static final class ClassSerializer extends Serializer { private static final byte USE_CLASS_ID = 0; private static final byte USE_CLASSNAME = 1; @@ -613,5 +631,6 @@ public static void registerDefaultSerializers(Fury fury) { fury.registerSerializer(AtomicInteger.class, new AtomicIntegerSerializer(fury)); fury.registerSerializer(AtomicLong.class, new AtomicLongSerializer(fury)); fury.registerSerializer(AtomicReference.class, new AtomicReferenceSerializer(fury)); + fury.registerSerializer(Currency.class, new CurrencySerializer(fury)); } } diff --git a/java/fury-core/src/test/java/io/fury/serializer/SerializersTest.java b/java/fury-core/src/test/java/io/fury/serializer/SerializersTest.java index 476f298820..cab463cc38 100644 --- a/java/fury-core/src/test/java/io/fury/serializer/SerializersTest.java +++ b/java/fury-core/src/test/java/io/fury/serializer/SerializersTest.java @@ -26,6 +26,7 @@ import io.fury.memory.MemoryBuffer; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Currency; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -141,4 +142,12 @@ public void testAtomic(Fury fury) { .get(), 200); } + + @Test + public void testCurrency() { + Fury fury = Fury.builder().withLanguage(Language.JAVA).build(); + Assert.assertEquals( + serDeCheckSerializer(fury, Currency.getInstance("EUR"), "Currency"), + Currency.getInstance("EUR")); + } }