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"));
+ }
}