写点什么

ARTS 打卡第 1 周: Jackson 如何自定义属性的序列化策略

作者:前行
  • 2023-08-16
    广东
  • 本文字数:2294 字

    阅读完需:约 8 分钟

Algorithm

题目:Leetcode 679.24 点游戏


class Solution {    // 24点    static final int TARGET_SUM = 24;    // 误差    static final double ERROR = 1e-6;    // 加减乘除标识    static int ADD = 0, MULTIPLY = 1, SUB = 2, DIV = 3;
/** * 解法:回溯法 * <p> * 时间复杂度:O(1) n为数组长度 * 空间复杂度:O(1) * * @param cards 数组 * @return */ public boolean judgePoint24(int[] cards) { List<Double> list = new ArrayList<>(cards.length); for (int card : cards) { list.add((double) card); } return solve(list); }

private static boolean solve(List<Double> cards) { if (cards == null || cards.size() == 0) { return false; } //算完后只剩一个数,即结果,误差在可接受范围内判true if (cards.size() == 1) { return Math.abs(cards.get(0) - TARGET_SUM) < ERROR; }
int size = cards.size(); // 选一个数 for (int i = 0; i < size; i++) { // 再选一个数,做运算 for (int j = 0; j < size; j++) { //不能挑一样的 if (i != j) { List<Double> list = new ArrayList<>(4); //没被挑到的扔进list for (int k = 0; k < size; k++) { if (k != i && k != j) { list.add(cards.get(k)); } }
// 4种运算挑一个,计算完的结果放到list里作为第3个值 for (int symbol = 0; symbol < 4; symbol++) { // symbol < 2表示 挑的是加或乘 // i > j是为了判定交换律的成立 //eg: i = 0, j = 1, symbol = 1 → 挑第一个和第二个数,两数相乘 // i = 1, j = 0, symbol = 1 → 挑第二个和第一个数,两数相乘 → 无效的重复计算 if (symbol < 2 && i > j) { continue; }
// 加法 if (symbol == ADD) { list.add(cards.get(i) + cards.get(j)); } else if (symbol == SUB) { // 减法 list.add(cards.get(i) - cards.get(j)); } else if (symbol == MULTIPLY) { // 乘法 list.add(cards.get(i) * cards.get(j)); } else if (symbol == DIV) { // 除法 // 被除数为0 if (Math.abs(cards.get(j)) < ERROR) { continue; } list.add(cards.get(i) / cards.get(j)); } // 至此元素个数由4->3,进入到3->2的过程,以此类推 if (solve(list)) { return true; }
// 没凑成24点就把list末尾的元素删除,考虑下种运算的可能 list.remove(list.size() - 1); } } } } return false; }}
复制代码

Review

英文原文链接:http://www.cowtowncoder.com/blog/archives/2011/02/entry_443.html


用户(程序员)最关心的话题之一是如何配置 Jackson,使得可以控制 Java 对象的属性是否序列化。这篇短文介绍了 Jasckson 的 7 种属性过滤方案。


  1. What gets serialized by default?

  2. Changing auto-detection defaults: @JsonAutoDetect

  3. Explicitly ignoring properties: @JsonIgnore, @JsonIgnoreProperties

  4. Defining profiles for dynamic ignoral: JSON Views (@JsonView)

  5. Ignoring all properties with specified type: @JsonIgnoreType

  6. Fully dynamic filtering: @JsonFilter

  7. Most extreme way to filter out properties: BeanSerializerModifier


具体来说,上层业务程序员使用方案 1、2、3、4 就已经可以满足了,但作为底层解析的公共组件,就有必要使用方案 6 和 7 了,目前笔者在实际项目中使用的是方法 6,JSON 过滤器是一种实现完全动态过滤的方法。最极端的方法是方案 7,基本思想是 BeanSerializerModifier 实例定义 Jackson BeanSerializerFactory 在构造序列化器期间调用的回调。

Tip

推荐闪电侠的《IntelliJ IDEA神器使用技巧》视频教程,1 个多小时的教程,总结了 IDEA 非常实用的一些使用技巧,如果学完后能灵活运用,相信提升 5-10 倍的开发效率不是问题。

Share

正则表达式

原文来自分享几个正则表达式相关的工具~


对程序员来说,正则表达式是一项非常基础而有用的技能,两个理由:


  1. 总有一天 RegEx 会是手头某个问题的最佳解决方案

  2. 当你在别人的代码中看到正则表达式时,它不是神秘的代码


如果你想更系统性的学习正则表达式,不妨看看 《精通正则表达式》第 3 版。


#ARTS 打卡计划#

发布于: 刚刚阅读数: 4
用户头像

前行

关注

还未添加个人签名 2018-09-06 加入

还未添加个人简介

评论

发布
暂无评论
ARTS 打卡第 1 周: Jackson如何自定义属性的序列化策略_#Jackson_前行_InfoQ写作社区