diff --git a/java/com/google/flatbuffers/FlexBuffers.java b/java/com/google/flatbuffers/FlexBuffers.java index 6e7b0868d..3a5c6558b 100644 --- a/java/com/google/flatbuffers/FlexBuffers.java +++ b/java/com/google/flatbuffers/FlexBuffers.java @@ -481,7 +481,7 @@ public class FlexBuffers { */ public String asString() { if (isString()) { - int start = indirect(bb, end, byteWidth); + int start = indirect(bb, end, parentWidth); int size = readInt(bb, start - byteWidth, byteWidth); return Utf8.getDefault().decodeUtf8(bb, start, size); } diff --git a/java/com/google/flatbuffers/FlexBuffersBuilder.java b/java/com/google/flatbuffers/FlexBuffersBuilder.java index a58c7a30c..64db751f3 100644 --- a/java/com/google/flatbuffers/FlexBuffersBuilder.java +++ b/java/com/google/flatbuffers/FlexBuffersBuilder.java @@ -64,7 +64,7 @@ public class FlexBuffersBuilder { * But serialization performance might be slower and consumes more memory. This is ideal if you expect many repeated * strings on the message. */ - public static final int BUILDER_FLAG_SHARE_STRINGS = 1; + public static final int BUILDER_FLAG_SHARE_STRINGS = 2; /** * Strings and keys will be shared between elements. */ diff --git a/tests/JavaTest.java b/tests/JavaTest.java index 8e404ffa4..2a1e21574 100644 --- a/tests/JavaTest.java +++ b/tests/JavaTest.java @@ -20,6 +20,8 @@ import java.io.*; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; +import java.util.Map; +import java.util.HashMap; import MyGame.Example.*; import NamespaceA.*; import NamespaceA.NamespaceB.*; @@ -884,6 +886,43 @@ class JavaTest { FlexBuffers.getRoot(b.getBuffer()).toString()); } + public static void testHashMapToMap() { + int entriesCount = 12; + + HashMap source = new HashMap<>(); + for (int i = 0; i < entriesCount; i++) { + source.put("foo_param_" + i, "foo_value_" + i); + } + + FlexBuffersBuilder builder = new FlexBuffersBuilder(1000); + int mapStart = builder.startMap(); + for (Map.Entry entry : source.entrySet()) { + builder.putString(entry.getKey(), entry.getValue()); + } + builder.endMap(null, mapStart); + ByteBuffer bb = builder.finish(); + bb.rewind(); + + FlexBuffers.Reference rootReference = FlexBuffers.getRoot(bb); + + TestEq(rootReference.isMap(), true); + + FlexBuffers.Map flexMap = rootReference.asMap(); + + FlexBuffers.KeyVector keys = flexMap.keys(); + FlexBuffers.Vector values = flexMap.values(); + + TestEq(entriesCount, keys.size()); + TestEq(entriesCount, values.size()); + + HashMap result = new HashMap<>(); + for (int i = 0; i < keys.size(); i++) { + result.put(keys.get(i).toString(), values.get(i).asString()); + } + + TestEq(source, result); + } + public static void TestFlexBuffers() { testSingleElementByte(); testSingleElementShort(); @@ -899,7 +938,8 @@ class JavaTest { testSingleElementUInt(); testSingleElementUByte(); testSingleElementMap(); - testFlexBuffersTest(); + testFlexBuffersTest(); + testHashMapToMap(); } static void TestEq(T a, T b) {