Jackson 详解
目录
前言
Jackson 是 Java 生态中最流行的 JSON 处理库之一,广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能,支持注解、模块化设计和多种数据格式(如 XML、YAML)。本文将详细介绍 Jackson 的核心模块、使用方法、注意事项以及代码示例。
1. Jackson 的核心模块
2. 使用 Jackson
2.1 添加依赖
2.2 核心类:ObjectMapper
2.3 基本使用
序列化
反序列化:
3. 使用注解
3.1 常用注解
3.2 示例代码
4. 高级用法
4.1 处理复杂对象
4.2 自定义序列化和反序列化
4.3 处理多态类型
5. 注意事项
6. 总结
前言
Jackson 是 Java 生态中最流行的 JSON 处理库之一,广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能,支持注解、模块化设计和多种数据格式(如 XML、YAML)。本文将详细介绍 Jackson 的核心模块、使用方法、注意事项以及代码示例。
1. Jackson 的核心模块
Jackson 采用模块化设计,核心模块包括:
jackson-core
:- 提供底层 JSON 解析和生成功能。
- 包含
JsonParser
(解析 JSON)和JsonGenerator
(生成 JSON)。
jackson-annotations
:- 提供丰富的注解,用于控制 JSON 的序列化和反序列化行为。
jackson-databind
:- 提供高级数据绑定功能,将 JSON 数据与 Java 对象相互转换。
jackson-dataformat-xml
:- 支持 XML 格式的序列化和反序列化。
jackson-dataformat-yaml
:- 支持 YAML 格式的序列化和反序列化。
2. 使用 Jackson
2.1 添加依赖
在 Maven 项目中,添加以下依赖:
<dependencies><!-- Jackson 核心模块 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.13.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.13.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency><!-- 可选:支持 XML --><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.13.3</version></dependency><!-- 可选:支持 YAML --><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId><version>2.13.3</version></dependency>
</dependencies>
2.2 核心类:ObjectMapper
ObjectMapper
是 Jackson 的核心类,用于实现 JSON 与 Java 对象的相互转换。以下是其常用方法:
方法 | 描述 |
---|---|
writeValueAsString(Object) | 将 Java 对象序列化为 JSON 字符串。 |
readValue(String, Class) | 将 JSON 字符串反序列化为 Java 对象。 |
writeValue(File, Object) | 将 Java 对象序列化到文件中。 |
readValue(File, Class) | 从文件中反序列化 JSON 数据。 |
2.3 基本使用
序列化
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {public static void main(String[] args) throws Exception {User user = new User("John", 30);ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(user);System.out.println(json); // 输出: {"name":"John","age":30}}
}
class User {private String name;private int age;// 构造函数、Getter 和 Setterpublic User(String name, int age) {this.name = name;this.age = age;}public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }
}
反序列化:
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {public static void main(String[] args) throws Exception {String json = "{\"name\":\"John\",\"age\":30}";ObjectMapper mapper = new ObjectMapper();User user = mapper.readValue(json, User.class);System.out.println(user.getName()); // 输出: JohnSystem.out.println(user.getAge()); // 输出: 30}
}
3. 使用注解
Jackson 提供了丰富的注解,用于控制 JSON 的序列化和反序列化行为。
3.1 常用注解
注解 | 描述 |
---|---|
@JsonProperty | 指定 JSON 字段的名称。 |
@JsonIgnore | 忽略字段,不参与序列化和反序列化。 |
@JsonFormat | 指定日期、时间等字段的格式化方式。 |
@JsonInclude | 控制字段在序列化时的包含规则(如非空字段才序列化)。 |
@JsonCreator | 指定反序列化时的构造函数或工厂方法。 |
@JsonAlias | 为字段指定多个 JSON 别名,反序列化时可以匹配多个名称。 |
3.2 示例代码
import com.fasterxml.jackson.annotation.*;
public class User {@JsonProperty("user_name")private String name;@JsonIgnoreprivate String password;@JsonFormat(pattern = "yyyy-MM-dd")private Date birthDate;@JsonInclude(JsonInclude.Include.NON_NULL)private String email;// 构造函数、Getter 和 Setter
}
4. 高级用法
4.1 处理复杂对象
Jackson 支持嵌套对象、集合和映射的序列化和反序列化。
class Address {private String city;private String street;// 构造函数、Getter 和 Setter
}
class User {private String name;private List<Address> addresses;// 构造函数、Getter 和 Setter
}
4.2 自定义序列化和反序列化
通过实现 JsonSerializer
和 JsonDeserializer
,可以自定义序列化和反序列化逻辑。
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
@JsonSerialize(using = CustomSerializer.class)
class User {private String name;// 构造函数、Getter 和 Setter
}
class CustomSerializer extends JsonSerializer<User> {@Overridepublic void serialize(User user, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeStartObject();gen.writeStringField("user_name", user.getName());gen.writeEndObject();}
}
4.3 处理多态类型
使用 @JsonTypeInfo
和 @JsonSubTypes
处理多态类型。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({@JsonSubTypes.Type(value = Dog.class, name = "dog"),@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
abstract class Animal {private String name;// 构造函数、Getter 和 Setter
}
class Dog extends Animal {private String breed;// 构造函数、Getter 和 Setter
}
class Cat extends Animal {private boolean likesCream;// 构造函数、Getter 和 Setter
}
5. 注意事项
- 性能优化:
- 重用
ObjectMapper
实例,避免重复创建。
- 重用
- 安全性:
- 反序列化时,避免直接反序列化不可信的 JSON 数据,防止反序列化攻击。
- 版本兼容性:
- 确保
jackson-core
、jackson-annotations
和jackson-databind
的版本一致。
- 确保
- 空值处理:
- 使用
@JsonInclude(JsonInclude.Include.NON_NULL)
忽略空值字段。
- 使用
补充:
1. JSON处理库的作用
1.1 Fastjson
Fastjson是阿里巴巴开源的高性能JSON库,主要用于Java对象与JSON字符串之间的序列化和反序列化。它支持复杂对象的处理,包括嵌套对象、泛型、集合等,广泛应用于高性能场景。
1.2 org.json
org.json是一个轻量级的JSON处理库,提供了JSON的解析、生成和操作功能。它的API设计简单,适合初学者和快速开发场景。
1.3 json-simple
json-simple是一个简单的JSON处理库,专注于基本的JSON解析和生成。它的API设计非常简洁,适合快速处理简单的JSON数据。
2. 技术原理
2.1 Fastjson
Fastjson的核心技术包括:
- 高性能解析:通过优化算法和数据结构,Fastjson在解析JSON时速度非常快。
- 动态类型处理:支持复杂对象的序列化和反序列化,包括泛型、嵌套对象等。
- 自定义序列化:允许开发者通过注解或自定义序列化器控制JSON的生成和解析。
2.2 org.json
org.json的核心技术包括:
- 轻量级设计:库的体积较小,适合资源有限的环境。
- 简单API:提供了JSONObject和JSONArray等核心类,易于上手。
- 功能齐全:支持JSON的解析、生成和操作。
2.3 json-simple
json-simple的核心技术包括:
- 简洁API:提供了JSONObject和JSONArray等核心类,API设计非常简洁。
- 轻量级设计:库的体积较小,适合快速开发场景。
- 基础功能:支持基本的JSON解析和生成。
3. 示例代码与输出结果
3.1 Fastjson示例
代码:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;public class FastjsonExample {public static void main(String[] args) {// 将Java对象转换为JSON字符串User user = new User("John", 30);String jsonString = JSON.toJSONString(user);System.out.println("Fastjson - JSON String: " + jsonString);// 将JSON字符串转换为Java对象User parsedUser = JSON.parseObject(jsonString, User.class);System.out.println("Fastjson - Parsed User: " + parsedUser);// 操作JSON对象JSONObject jsonObject = JSON.parseObject(jsonString);jsonObject.put("age", 31);System.out.println("Fastjson - Updated JSON: " + jsonObject.toJSONString());}
}class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}// Getters and Setters@Overridepublic String toString() {return "User{name='" + name + "', age=" + age + "}";}
}
输出结果:
Fastjson - JSON String: {"age":30,"name":"John"}
Fastjson - Parsed User: User{name='John', age=30}
Fastjson - Updated JSON: {"age":31,"name":"John"}
3.2 org.json示例
代码:
import org.json.JSONObject;public class OrgJsonExample {public static void main(String[] args) {// 创建JSON对象JSONObject jsonObject = new JSONObject();jsonObject.put("name", "John");jsonObject.put("age", 30);System.out.println("org.json - JSON Object: " + jsonObject);// 从JSON字符串解析JSON对象String jsonString = "{\"name\":\"John\",\"age\":30}";JSONObject parsedJsonObject = new JSONObject(jsonString);System.out.println("org.json - Parsed JSON Object: " + parsedJsonObject);// 操作JSON对象parsedJsonObject.put("age", 31);System.out.println("org.json - Updated JSON Object: " + parsedJsonObject);}
}
输出结果:
org.json - JSON Object: {"name":"John","age":30}
org.json - Parsed JSON Object: {"name":"John","age":30}
org.json - Updated JSON Object: {"name":"John","age":31}
3.3 json-simple示例
代码:
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;public class JsonSimpleExample {public static void main(String[] args) throws Exception {// 创建JSON对象JSONObject jsonObject = new JSONObject();jsonObject.put("name", "John");jsonObject.put("age", 30);System.out.println("json-simple - JSON Object: " + jsonObject.toJSONString());// 从JSON字符串解析JSON对象String jsonString = "{\"name\":\"John\",\"age\":30}";JSONParser parser = new JSONParser();JSONObject parsedJsonObject = (JSONObject) parser.parse(jsonString);System.out.println("json-simple - Parsed JSON Object: " + parsedJsonObject);// 操作JSON对象parsedJsonObject.put("age", 31);System.out.println("json-simple - Updated JSON Object: " + parsedJsonObject.toJSONString());}
}
输出结果:
json-simple - JSON Object: {"name":"John","age":30}
json-simple - Parsed JSON Object: {"name":"John","age":30}
json-simple - Updated JSON Object: {"name":"John","age":31}
4. 对比与总结
特性 | Fastjson | org.json | json-simple |
---|---|---|---|
性能 | 高性能,适合大数据量处理 | 性能一般 | 性能一般 |
功能性 | 功能强大,支持复杂对象 | 功能齐全 | 功能基础 |
易用性 | API设计简单,易于上手 | API设计简单,适合初学者 | API设计简洁,快速上手 |
体积 | 较大 | 较小 | 较小 |
结论:
- 如果需要处理大量的JSON数据,并且对性能有较高要求,Fastjson 是最佳选择。
- 如果需要一个轻量级且功能齐全的JSON库,org.json 是一个不错的选择。
- 如果只需要快速处理简单的JSON数据,json-simple 是最简单的选择。
5. 注意事项
- Fastjson的安全性:Fastjson在过去曾被发现存在一些安全漏洞,建议使用最新版本并关注官方更新。
- 库的选择:根据项目需求和开发环境选择合适的JSON库,避免过度依赖单一库。
使用前导入对应的库:
6. 总结
Jackson 是 Java 生态中最强大的 JSON 处理库,提供了高效、灵活的序列化和反序列化功能。通过合理使用注解和高级特性,可以满足各种复杂的 JSON 处理需求。无论是 RESTful API、数据存储还是数据传输,Jackson 都是不可或缺的工具。
相关文章:
Jackson 详解
目录 前言 Jackson 是 Java 生态中最流行的 JSON 处理库之一,广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能,支持注解、模块化设计和多种数据格式(如 XML、YAML)。本文将详细介…...
03 HarmonyOS Next仪表盘案例详解(二):进阶篇
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! 文章目录 前言1. 响应式设计1.1 屏幕适配1.2 弹性布局 2. 数据展示与交互2.1 数据卡片渲染2.2 图表区域 3. 事件处理机制3.1 点击事件处理3.2 手势…...
【QT】-易错点笔记-2025-2-7
1,QList<phy_simulator*> pList;为空不能append()追加,要先new,再用 QList<phy_simulator> pList为空时,确实不能调用 append() 方法。原因很简单,QList 是一个类对象,在 C++ 中,指针本身并不代表它指向的对象。因此,当你有一个指向 QList<phy_simulato…...
嵌入式 ARM Linux 系统构成(3):根文件系统(Root File System)
目录 一、根文件系统的原理与重要性 二、根文件系统的构成 2.1. 基本目录结构 2.2. 核心组件 2.3. 设备驱动 2.4. 网络工具和协议 2.5. 调试工具 三、根文件系统的制作方法 四、根文件系统的测试 五、构建根文件系统的关键技术 5.1. 最小化构建工具 5.2. 关键配置文…...
electron + vue3 + vite 主进程到渲染进程的单向通信
用示例讲解下主进程到渲染进程的单向通信 初始版本项目结构可参考项目:https://github.com/ylpxzx/electron-forge-project/tree/init_project 主进程到渲染进程(单向) 以Electron官方文档给出的”主进程主动触发动作,发送内容给渲…...
基于Python实现的智能旅游推荐系统(Django)
基于Python实现的智能旅游推荐系统(Django) 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat 系统功能实现 总体设计 系统实现 系统首页模块 统首页页面主要包括首页,旅游资讯,景点信息…...
分布式存储—— HBase数据模型 详解
目录 1.3 HBase数据模型 1.3.1 两类数据模型 1.3.2 数据模型的重要概念 1.3.3 数据模型的操作 1.3.4 数据模型的特殊属性 1.3.5 CAP原理与最终一致性 1.3.6 小结 本文章参考、总结于学校教材课本《HBase开发与应用》 1.3 HBase数据模型 在开始学习HBase之前非常…...
使用AI整理知识点--WPF动画核心知识
一、WPF动画基础 1、动画本质 通过随时间改变依赖属性值实现视觉效果(如位置、透明度、颜色等)。 依赖属性必须支持 DependencyProperty,且需是可动画的(如 Double, Color, Point 等)。 2、动画三要素 起始值 (Fr…...
计算光学成像与光学计算概论
计算光学成像所涉及研究的内容非常广泛,虽然计算光学成像的研究内容是发散的,但目的都是一致的:如何让相机记录到客观实物更丰富的信息,延伸并扩展人眼的视觉感知。总的来说,计算光学成像现阶段已经取得了很多令人振奋…...
100天精通Python(爬虫篇)——第115天:爬虫在线小工具_Curl转python爬虫代码工具(快速构建初始爬虫代码)
文章目录 一、curl是什么?二、爬虫在线小工具(牛逼puls)三、实战操作 一、curl是什么? 基本概念:curl 支持多种协议,如 HTTP、HTTPS、FTP、SFTP 等,可用于从服务器获取数据或向服务器发送数据&a…...
点云软件VeloView开发环境搭建与编译
官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程: 安装vs2019,windows sdk,qt5.14.2(没安装到5.15.7),git,cmake3.31,python3.7.9,ninja下载放到…...
PHP配置虚拟主机
虚拟主机: 不是真实存在的主机, 因为一台电脑理论上讲只能作为一个网站: 事实上,一个网站是一个文件夹. 在本地开发中,通过虚拟主机配置可以实现多域名独立访问不同项目目录(如 www.project1.test 和 www.project2.test),以 ”XAM…...
笔记四:C语言中的文件和文件操作
Faye:只要有正确的伴奏,什么都能变成好旋律。 ---------《寻找天堂》 目录 一、文件介绍 1.1程序文件 1.2 数据文件 1.3 文件名 二、文件的打开和关闭 2.1 文件指针 2.2.文件的打开和关闭 2.3 文件读取结束的判定 三、 文件的顺序读写 3.1 顺序读写…...
PyTorch中的线性变换:nn.Parameter VS nn.Linear
self.weight nn.Parameter(torch.randn(in_channels, out_channels)) 和 self.linear nn.Linear(in_channels, out_channels) 并不完全一致,尽管它们都可以用于实现线性变换(即全连接层),但它们的使用方式和内部实现有所不同。 …...
计算机网络(1) 网络通信基础,协议介绍,通信框架
网络结构模式 C/S-----客户端和服务器 B/S -----浏览器服务器 MAC地址 每一个网卡都拥有独一无二的48位串行号,也即MAC地址,也叫做物理地址、硬件地址或者是局域网地址 MAC地址表示为12个16进制数 如00-16-EA-AE-3C-40 (每一个数可以用四个…...
PHP之常量
在你有别的编程语言的基础下,你想学习PHP,可能要了解的一些关于常量的信息。 PHP中的常量不用指定数据类型,可以使用两次方法定义。 使用const //定义常量 const B 2; echo B . PHP_EOL;使用define define("A", 1); echo A . P…...
苦瓜书盘官网,免费pdf/mobi电子书下载网站
苦瓜书盘(kgbook)是一个专注于提供6英寸PDF和MOBI格式电子书的免费下载平台,专为电子阅读器用户设计。该平台为用户提供了丰富的电子书资源,涵盖文学、历史、科学、技术等多个领域,旨在打造一个全面的电子书资源库。用…...
通过 Docker openssl 容器生成生成Nginx证书文件
使用 alpine/openssl 镜像生成证书 1. 拉取容器 [rootlocalhost ~]# docker run --rm alpine/openssl version OpenSSL 3.3.3 11 Feb 2025 (Library: OpenSSL 3.3.3 11 Feb 2025)2. 运行 alpine/openssl 生成证书(Nginx) # 生成1个.key私钥文件&#…...
第四十一:Axios 模型的 get ,post请求
Axios 的 get 请求方式 9.双向数据绑定 v-model - 邓瑞编程 Axios 的 post 请求方式:...
从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十) 收发消息
1.聊天框 首先我们完善前端的消息输入框 components下面新建MessageInput组件 import { useState,useRef } from "react" import {X,Image,Send} from "lucide-react"import { useChatStore } from "../store/useChatStore" import toast from…...
Spring Boot面试问答
1. Spring Boot 基础知识 问题 1:什么是Spring Boot?它与Spring框架有何不同? 回答: Spring Boot是基于Spring框架的一个开源框架,旨在简化新Spring应用的初始化和开发过程。与传统的Spring框架相比,Spring Boot提供了以下优势: 自动配置:根据项目依赖自动配置Spring…...
win11编译llama_cpp_python cuda128 RTX30/40/50版本
Geforce 50xx系显卡最低支持cuda128,llama_cpp_python官方源只有cpu版本,没有cuda版本,所以自己基于0.3.5版本源码编译一个RTX 30xx/40xx/50xx版本。 1. 前置条件 1. 访问https://developer.download.nvidia.cn/compute/cuda/12.8.0/local_…...
2025-03-07 学习记录--C/C++-C语言 截取字符串的三种方法
C语言 截取字符串 ⭐️ 方法 1:使用 strncpy 函数 🍭 strncpy 是C标准库中的一个函数,用于从源字符串中复制指定长度的字符到目标字符串中。【详情请查看我的另一篇文章】 示例代码:🌰 #include <stdio.h> #in…...
doris: Oracle
Apache Doris JDBC Catalog 支持通过标准 JDBC 接口连接 Oracle 数据库。本文档介绍如何配置 Oracle 数据库连接。 使用须知 要连接到 Oracle 数据库,您需要 Oracle 19c, 18c, 12c, 11g 或 10g。 Oracle 数据库的 JDBC 驱动程序,您可以从 Maven 仓库…...
【神经网络】python实现神经网络(一)——数据集获取
一.概述 在文章【机器学习】一个例子带你了解神经网络是什么中,我们大致了解神经网络的正向信息传导、反向传导以及学习过程的大致流程,现在我们正式开始进行代码的实现,首先我们来实现第一步的运算过程模拟讲解:正向传导。本次代…...
自学嵌入式第27天------TCP和UDP,URL爬虫
1. TCP和UDP区别 **TCP(传输控制协议)和UDP(用户数据报协议)**是两种主要的传输层协议,它们在数据传输方式上有显著区别: 连接性: TCP是面向连接的协议,通信前需通过三次握手建立连…...
【虚拟化】Docker Desktop 架构简介
在阅读前您需要了解 docker 架构:Docker architecture WSL 技术:什么是 WSL 2 1.Hyper-V backend 我们知道,Docker Desktop 最开始的架构的后端是采用的 Hyper-V。 Docker daemon (dockerd) 运行在一个 Linux distro (LinuxKit build) 中&…...
C#程序加密与解密Demo程序示例
目录 一、加密程序功能介绍 1、加密用途 2、功能 3、程序说明 4、加密过程 5、授权的注册文件保存方式 二、加密程序使用步骤 1、步骤一 编辑2、步骤二 3、步骤三 4、步骤四 三、核心代码说明 1、获取电脑CPU 信息 2、获取硬盘卷标号 3、机器码生成 3、 生成…...
200W数据需要去重,如何优化?
优化去重逻辑的时间取决于多个因素,包括数据量、数据结构、硬件性能(CPU、内存)、去重算法的实现方式等。以下是对优化去重逻辑的详细分析和预期优化效果: 1. 去重逻辑的性能瓶颈 时间复杂度:使用HashSet去重的时间复…...
理解 UDP 协议与实战:Android 使用 UDP 发送和接收消息
一、UDP 协议概述 UDP(User Datagram Protocol,用户数据报协议)是一个无连接的网络通信协议。与 TCP 不同,UDP 不建立连接,不保证数据的顺序和完整性。它的特点是简单、高效,适用于实时性要求较高、对数据…...
7V 至 30V 的超宽 VIN 输入范围,转换效率高达 96%的WD5030
WD5030 具备 7V 至 30V 的超宽 VIN 输入范围,这一特性使其能够适应多种不同电压等级的供电环境,无论是在工业设备中常见的较高电压输入,还是在一些便携式设备经过初步升压后的电压,WD5030 都能轻松应对,极大地拓展了应…...
基于 LeNet 网络的 MNIST 数据集图像分类
1.LeNet的原始实验数据集MNIST 名称:MNIST手写数字数据集 数据类型:灰度图 (一通道) 图像大小:28*28 类别数:10类(数字0-9) 1.通过torchvision.datasets.MNIST下载并保存到本地…...
智能体开发:推理-行动(ReAct)思维链提示
人类在处理一个需要多个步骤才能完成任务时,显著特点是能够将言语推理(内心独白)和实际行动融合在一起,在面对陌生或不确定的情况时通过这种方法学习新知识,做出决策,并执行,从而应对复杂的任务…...
Android Native 之 文件系统挂载
一、文件系统挂载流程概述 二、文件系统挂载流程细节 1、Init启动阶段 众所周知,init进程为android系统的第一个进程,也是native世界的开端,要想让整个android世界能够稳定的运行,文件系统的创建和初始化是必不可少的ÿ…...
DirectX12(D3D12)基础教程四 入门指南
本章主要讲了些D3D12概念和理论,对第一、二章相关概念的补充和纠正,要的理解D3D12概念和理论基础,结合代码加深理解。 命令队列和命令列表 为了实现渲染工作的重用和多线程缩放, 在 D3D12 中,做了三个重要方面不同于 …...
android13打基础: timepicker控件
public class Ch4_TimePickerActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {private TextView tv_time; // 声明一个文本视图对象private TimePicker tp_time; // 声明一个时间选择器对象Overrideprotected void onCreate(Nullable Bund…...
国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡
基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡 一、板卡概述 本板卡基于 FPGAJFM7K325T 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持PXIE标准协议,其中XJ3…...
Oracle SQL优化①——查看SQL执行计划的几种方法
前言 在日常的运维工作中,SQL优化是DBA的进阶技能,SQL优化的前提是要看SQL的执行计划是否正确,下面分享几种查看执行计划的方法,每一种方法都各有各的好处,可以根据特定场景选择某种方法。 一.使用AUTOTRACE查看执行…...
MySQL主从架构配合ShardingJdbc实现读写分离
文章目录 目录架构搭建读写分离pom.xmlfdy-live-user-provider 模块application.ymlfdy-db-sharding.yamlShardingJdbcDatasourceAutoInitConnectionConfig.java 目录 架构搭建 基于Docker去创建MySQL的主从架构 读写分离 pom.xml <dependency><groupId>mysql…...
MyBatis @Param 注解详解:多参数传递与正确使用方式
Param 注解主要用于 MyBatis 进行参数传递时给 SQL 语句中的参数 起别名,通常用于 多参数 方法,使参数在 XML Mapper 文件或注解 SQL 语句中更清晰易用。 1. 基本用法 在 Mapper 接口中使用 Param 来为参数命名,避免 MyBatis 解析时出现参数…...
【JAVA架构师成长之路】【Redis】第14集:Redis缓存穿透原理、规避、解决方案
30分钟自学教程:Redis缓存穿透原理与解决方案 目标 理解缓存穿透的成因及危害。掌握布隆过滤器、空值缓存等核心防御技术。能够通过代码实现请求拦截与缓存保护。学会限流降级、异步加载等应急方案。 教程内容 0~2分钟:缓存穿透的定义与核心原因 定义…...
mybatis报错org/apache/commons/lang3/tuple/Pair] with root cause
mybatis一对多查询配置resultMap映射报错org/apache/commons/lang3/tuple/Pair] with root cause 原因是mybatis依赖common-lang3这个包, 只需要添加common-lang3的依赖坐标即可: <dependency><groupId>org.apache.commons</groupId><artifactId>comm…...
supervisord管理Gunicorn进程,使用Nginx作为反向代理运行flask web项目
1. 安装 Gunicorn 在项目虚拟环境中安装 Gunicorn:2. 基本用法 配置文件 创建一个 Gunicorn 配置文件(如 gunicorn_config.py),方便管理复杂配置。 示例 gunicorn_config.py: bind "0.0.0.0:8000" #…...
STM32之软件SPI
SPI传输更快,最大可达80MHz,而I2C最大只有3.4MHz。输入输出是分开的,可以同时输出输入。是同步全双工。仅支持一主多从。SS是从机选择线。每个从机一根。SPI无应答机制的设计。 注意:所有设备需要共地,时钟线主机输出&…...
fastjson漏洞
fastjson漏洞 fastjson工作原理攻击原理补充 例子 fastjson工作原理 fastjson的作用是将JAVA对象转换成对应的json表示形式,也可以反过来将json转化为对应的Java对象。fastjson使用AutoType功能进行反序列化,AutoType使用type标记字符的原始类型&#x…...
【YOLOv12改进trick】医学图像分割网络CMUNeXt引入YOLOv12中,增强全局上下文信息实现涨点,含创新点Python代码,方便发论文
🍋改进模块🍋:医学全卷积U型网络(CMUNeXtBlock) 🍋解决问题🍋:CMUNeXtBlock模块解决了在医学图像分割任务中,传统的卷积操作由于其局部性限制,难以有效提取全局上下文信息的问题。 🍋改进优势🍋:利用大卷积核和倒置瓶颈结构,提取全局上下文信息,同时保持卷…...
机器学习的半监督学习,弱监督学习,自监督学习
半监督学习、弱监督学习和自监督学习是机器学习中利用不同形式监督信号的三种方法,它们的核心区别在于标注数据的数量、质量以及监督信号的来源。以下是它们的详细对比: 1. 半监督学习(Semi-Supervised Learning) 核心特点&#x…...
K8S学习之基础十七:k8s的蓝绿部署
蓝绿部署概述 蓝绿部署中,一共有两套系统,一套是正在提供服务的系统,一套是准备发布的系统。两套系统都是功能完善、正在运行的系统,只是版本和对外服务情况不同。 开发新版本,要用新版本替换线上的旧版本&…...
【计算机网络】计算机网络的性能指标——时延、时延带宽积、往返时延、信道利用率
计算机网络的性能指标 导读 大家好,很高兴又和大家见面啦!!! 在上一篇内容中我们介绍了计算机网络的三个性能指标——速率、带宽和吞吐量。用大白话来说就是:网速、最高网速和实时网速。 相信大家看到这三个词应该就…...
单片机如何用C语言重写vfprintf
在单片机中,标准库函数 vfprintf 可能不可用或占用过多资源(如内存或代码空间),因此我们可以通过自定义实现一个轻量级的 vfprintf 函数,专门用于单片机的串口输出。以下是一个用 C 语言重写 vfprintf 的示例ÿ…...