Closed
Description
Hi,
When I tried to serialize an object containing the List attribute, I deserialized it to obtain a disordered List.
1.Problem
Test.class
Jackson2HashMapper jackson2HashMapper = new Jackson2HashMapper(true);
List<Integer> list = IntStream.range(0, 20).boxed().collect(Collectors.toList());
User user = new User();
user.setUserAgeList(list);
System.out.println("before serialize, user=" + user);
Map<String, Object> map = jackson2HashMapper.toHash(user);
User user1 = (User)jackson2HashMapper.fromHash(map);
System.out.println("after serialize, user=" + user1);
User.class
@Data
public class User {
private List<Integer> userAgeList;
}
result:
before serialize, user=User(userAgeList=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
after serialize, user=User(userAgeList=[0, 1, 18, 3, 4, 2, 19, 7, 8, 5, 6, 9, 12, 13, 10, 11, 14, 15, 16, 17])
2.Reason
org.springframework.data.redis.hash.Jackson2HashMapper#flattenMap use HashMap to store elements.
private Map<String, Object> flattenMap(Iterator<Entry<String, JsonNode>> source) {
Map<String, Object> resultMap = new HashMap();
this.doFlatten("", source, resultMap);
return resultMap;
}
3.Solution
Modify the storage set to LinkedHashMap.
private Map<String, Object> flattenMap(Iterator<Entry<String, JsonNode>> source) {
Map<String, Object> resultMap = new LinkedHashMap();
this.doFlatten("", source, resultMap);
return resultMap;
}
Thanks in advance!