diff --git a/java/fury-core/src/main/java/io/fury/resolver/ClassResolver.java b/java/fury-core/src/main/java/io/fury/resolver/ClassResolver.java index 6a13c0135b..48b787ab26 100644 --- a/java/fury-core/src/main/java/io/fury/resolver/ClassResolver.java +++ b/java/fury-core/src/main/java/io/fury/resolver/ClassResolver.java @@ -207,7 +207,6 @@ public void initialize() { private void addDefaultSerializers() { // primitive types will be boxed. addDefaultSerializer(String.class, new StringSerializer(fury)); - addDefaultSerializer(String[].class, new Serializers.StringArraySerializer(fury)); Serializers.registerDefaultSerializers(fury); ArraySerializers.registerDefaultSerializers(fury); } diff --git a/java/fury-core/src/main/java/io/fury/serializer/ArraySerializers.java b/java/fury-core/src/main/java/io/fury/serializer/ArraySerializers.java index 67ba44b512..28fbd71711 100644 --- a/java/fury-core/src/main/java/io/fury/serializer/ArraySerializers.java +++ b/java/fury-core/src/main/java/io/fury/serializer/ArraySerializers.java @@ -397,6 +397,78 @@ protected double[] newInstance(int numElements) { } } + public static final class StringArraySerializer extends Serializer { + private final StringSerializer stringSerializer; + + public StringArraySerializer(Fury fury) { + super(fury, String[].class); + stringSerializer = new StringSerializer(fury); + } + + @Override + public short getCrossLanguageTypeId() { + return (short) -Type.FURY_STRING_ARRAY.getId(); + } + + @Override + public void write(MemoryBuffer buffer, String[] value) { + int len = value.length; + buffer.writeInt(len); + for (String elem : value) { + // TODO reference support + if (elem != null) { + buffer.writeByte(Fury.REF_VALUE_FLAG); + stringSerializer.writeJavaString(buffer, elem); + } else { + buffer.writeByte(Fury.NULL_FLAG); + } + } + } + + @Override + public String[] read(MemoryBuffer buffer) { + int numElements = buffer.readInt(); + String[] value = new String[numElements]; + fury.getReferenceResolver().reference(value); + for (int i = 0; i < numElements; i++) { + if (buffer.readByte() == Fury.REF_VALUE_FLAG) { + value[i] = stringSerializer.readJavaString(buffer); + } else { + value[i] = null; + } + } + return value; + } + + @Override + public void crossLanguageWrite(MemoryBuffer buffer, String[] value) { + int len = value.length; + buffer.writeInt(len); + for (String elem : value) { + if (elem != null) { + buffer.writeByte(Fury.REF_VALUE_FLAG); + stringSerializer.writeUTF8String(buffer, elem); + } else { + buffer.writeByte(Fury.NULL_FLAG); + } + } + } + + @Override + public String[] crossLanguageRead(MemoryBuffer buffer) { + int numElements = buffer.readInt(); + String[] value = new String[numElements]; + for (int i = 0; i < numElements; i++) { + if (buffer.readByte() == Fury.REF_VALUE_FLAG) { + value[i] = stringSerializer.readUTF8String(buffer); + } else { + value[i] = null; + } + } + return value; + } + } + public static void registerDefaultSerializers(Fury fury) { fury.registerSerializer(Object[].class, new ObjectArraySerializer<>(fury, Object[].class)); fury.registerSerializer(byte[].class, new ByteArraySerializer(fury)); @@ -407,6 +479,7 @@ public static void registerDefaultSerializers(Fury fury) { fury.registerSerializer(float[].class, new FloatArraySerializer(fury)); fury.registerSerializer(double[].class, new DoubleArraySerializer(fury)); fury.registerSerializer(boolean[].class, new BooleanArraySerializer(fury)); + fury.registerSerializer(String[].class, new StringArraySerializer(fury)); } // ########################## utils ########################## 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 e66a18428f..6d95ce4e9e 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 @@ -558,78 +558,6 @@ public AtomicReference read(MemoryBuffer buffer) { } } - public static final class StringArraySerializer extends Serializer { - private final StringSerializer stringSerializer; - - public StringArraySerializer(Fury fury) { - super(fury, String[].class); - stringSerializer = new StringSerializer(fury); - } - - @Override - public short getCrossLanguageTypeId() { - return (short) -Type.FURY_STRING_ARRAY.getId(); - } - - @Override - public void write(MemoryBuffer buffer, String[] value) { - int len = value.length; - buffer.writeInt(len); - for (String elem : value) { - // TODO reference support - if (elem != null) { - buffer.writeByte(Fury.REF_VALUE_FLAG); - stringSerializer.writeJavaString(buffer, elem); - } else { - buffer.writeByte(Fury.NULL_FLAG); - } - } - } - - @Override - public String[] read(MemoryBuffer buffer) { - int numElements = buffer.readInt(); - String[] value = new String[numElements]; - fury.getReferenceResolver().reference(value); - for (int i = 0; i < numElements; i++) { - if (buffer.readByte() == Fury.REF_VALUE_FLAG) { - value[i] = stringSerializer.readJavaString(buffer); - } else { - value[i] = null; - } - } - return value; - } - - @Override - public void crossLanguageWrite(MemoryBuffer buffer, String[] value) { - int len = value.length; - buffer.writeInt(len); - for (String elem : value) { - if (elem != null) { - buffer.writeByte(Fury.REF_VALUE_FLAG); - stringSerializer.writeUTF8String(buffer, elem); - } else { - buffer.writeByte(Fury.NULL_FLAG); - } - } - } - - @Override - public String[] crossLanguageRead(MemoryBuffer buffer) { - int numElements = buffer.readInt(); - String[] value = new String[numElements]; - for (int i = 0; i < numElements; i++) { - if (buffer.readByte() == Fury.REF_VALUE_FLAG) { - value[i] = stringSerializer.readUTF8String(buffer); - } else { - value[i] = null; - } - } - return value; - } - } - public static final class ClassSerializer extends Serializer { private static final byte USE_CLASS_ID = 0; private static final byte USE_CLASSNAME = 1;