snack - Json 序列化类型安全控制
序列化类型安全控制,我们可以借助 ObjectEncoder(会优先匹配) 和 ObjectPatternEncoder 实现。
示例1:白名单风格
public class TypeSafety {
@Test
public void case1() {
Options options = Options.of();
//使用 ObjectFactory 模拟白名单
options.addFactory(User.class, (opts, node, clazz) -> new User());
options.addFactory(Order.class, (opts, node, clazz) -> new Order());
//使用 ObjectPatternFactory 模拟黑名单
options.addFactory(new ObjectPatternFactory<Object>() {
@Override
public boolean calCreate(Class<?> clazz) {
return true;
}
@Override
public Object create(Options opts, ONode node, Class<?> clazz) {
throw new SnackException("");
}
});
//效果测试
Assertions.assertThrows(SnackException.class, () -> {
ONode.deserialize("{id:1}", UserModel.class, options);
});
ONode.deserialize("{id:1}", Map.class, options);
}
}
示例2:黑名单风格
public class TypeSafety {
@Test
public void case2() {
//使用 ObjectPatternFactory 模拟黑名单
Options options = Options.of().addFactory(new ObjectPatternFactory<Object>() {
@Override
public boolean calCreate(Class<?> clazz) {
return true;
}
@Override
public Object create(Options opts, ONode node, Class<?> clazz) {
if(clazz.getName().startsWith("sun.")) {
//这里算黑名单
throw new SnackException("");
} else {
return null; //返回 null 后,由框架自动处理
}
}
});
//效果测试
Assertions.assertThrows(SnackException.class, () -> {
ONode.deserialize("{id:1}", UserModel.class, options);
});
ONode.deserialize("{id:1}", Map.class, options);
}
}