你好,我是redis-replicator作者,报如下issue
- fastjson版本: 1.2.44
- java版本: jdk 1.8.151
- 重现代码
public class FastJSONEventSerializer implements Serializer<Event> {
private static SerializeConfig config = new SerializeConfig();
private static SerializerFeature[] sfeatures = { WriteEnumUsingToString,
DisableCircularReferenceDetect, WriteClassName };
private static Feature[] features = { Feature.DisableCircularReferenceDetect };
static {
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
}
@Override
public Event read(byte[] bytes) {
return (Event) JSON.parse(bytes, features);
}
@Override
public byte[] write(Event event) {
return JSONObject.toJSONBytes(event, config, sfeatures);
}
public static void main(String[] args) {
Serializer<Event> serializer = new FastJSONEventSerializer();
Map<String, String> v1 = new LinkedHashMap<>();
v1.put("a","b");
v1.put("c","d");
Map<byte[], byte[]> v2 = new ByteArrayMap<>();
v2.put(new byte[]{-12,31,23,2}, new byte[]{-12,31,23,3});
v2.put(new byte[]{-12,31,23,3}, new byte[]{-12,31,23,2});
MSetCommand command = new MSetCommand(v1, v2);
System.out.println(command.getKv().getClass());
System.out.println(command.getRawKv().getClass());
command = (MSetCommand)serializer.read(serializer.write(command));
System.out.println(command.getKv().getClass());
System.out.println(command.getRawKv().getClass());
}
}
输出
class java.util.LinkedHashMap
class com.moilioncircle.redis.replicator.util.ByteArrayMap
class java.util.HashMap
class java.util.HashMap
发现之前的类型分别为LinkedHashMap和ByteArrayMap,之后全变为HashMap了
相关的类代码MSetCommand和ByteArrayMap
2条答案
按热度按时间ny6fqffe1#
请使用https://github.com/alibaba/fastjson/wiki/TypeReference
6bc51xsx2#
不能用typereference,因为不知道具体的type,我的理解是map序列化的时候已经开启了WriteClassName, 那么反序列化的时候就应该用@type的信息,为什么没有用这个信息而反序列化成hashmap了呢