Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import org.apache.fory.context.WriteContext;
import org.apache.fory.memory.MemoryBuffer;
import org.apache.fory.meta.TypeDef;
import org.apache.fory.reflect.FieldAccessor;
import org.apache.fory.reflect.ReflectionUtils;
import org.apache.fory.resolver.ClassResolver;
import org.apache.fory.resolver.TypeInfo;
Expand Down Expand Up @@ -107,23 +108,41 @@ public Map newMap(Map map) {
}

public static final class LinkedHashMapSerializer extends MapSerializer<LinkedHashMap> {
private static final class AccessOrderAccessor {
private static final FieldAccessor INSTANCE =
FieldAccessor.createAccessor(
ReflectionUtils.getDeclaredField(LinkedHashMap.class, "accessOrder"));
}

public LinkedHashMapSerializer(TypeResolver typeResolver) {
super(typeResolver, LinkedHashMap.class, true);
}

@Override
public Map onMapWrite(WriteContext writeContext, LinkedHashMap value) {
Map map = super.onMapWrite(writeContext, value);
if (!config.isXlang()) {
writeContext.getBuffer().writeBoolean(AccessOrderAccessor.INSTANCE.getBoolean(value));
}
return map;
}

@Override
public LinkedHashMap newMap(ReadContext readContext, boolean entryReadAlwaysAdvances) {
MemoryBuffer buffer = readContext.getBuffer();
int numElements = readMapSize(readContext, buffer, entryReadAlwaysAdvances);
setNumElements(numElements);
LinkedHashMap hashMap = new LinkedHashMap(numElements);

boolean accessOrder = !config.isXlang() && buffer.readBoolean();
LinkedHashMap hashMap = new LinkedHashMap(numElements, 0.75f, accessOrder);
readContext.reference(hashMap);
return hashMap;
}

@Override
public Map newMap(Map map) {
return new LinkedHashMap(map.size());
boolean accessOrder = !config.isXlang() && AccessOrderAccessor.INSTANCE.getBoolean(map);
return new LinkedHashMap(map.size(), 0.75f, accessOrder);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,39 @@ public void basicTestCaseWithMultiConfig(
serDeCheck(fory, obj1);
}

@Test
public void testLinkedHashMapAccessOrder() {
Fory fory = getJavaFory();

LinkedHashMap<Integer, Integer> original = new LinkedHashMap<>(16, 0.75f, true);
original.put(1, 1);
original.put(2, 2);
original.put(3, 3);
original.put(4, 4);

byte[] bytes = fory.serialize(original);
LinkedHashMap<Integer, Integer> deserialized =
(LinkedHashMap<Integer, Integer>) fory.deserialize(bytes);

original.get(2);
deserialized.get(2);

assertEquals(new ArrayList<>(original.keySet()), new ArrayList<>(deserialized.keySet()));
assertEquals(
new ArrayList<>(java.util.Arrays.asList(1, 3, 4, 2)),
new ArrayList<>(deserialized.keySet()));

original.get(4);
original.get(1);
original.get(3);

deserialized.get(4);
deserialized.get(1);
deserialized.get(3);

assertEquals(new ArrayList<>(original.keySet()), new ArrayList<>(deserialized.keySet()));
}

@Test(dataProvider = "referenceTrackingConfig")
public void testBasicMap(boolean referenceTrackingConfig) {
Fory fory =
Expand Down
Loading