关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)
注:另一种方式参考
关于@TableField中TypeHandler属性,自定义的类型处理器的使用(密码加密与解密举例)http://t.csdnimg.cn/NZy4G
1.简介
1.1 序列化与反序列化
学习注解之前,我们可以先了解一下什么是序列化与反序列化?
1.1.1序列化
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。通常,对象会被转换为字节序列,这样它们就可以被写入文件、存储在数据库中,或者通过网络发送给其他计算机。
目的:
- 持久化:将对象的状态保存到文件或数据库中,以便在程序下次运行时可以恢复对象的状态。
- 网络传输:通过将对象转换为字节序列,可以在网络上传输对象的状态,使得分布式系统中的不同部分可以共享数据。
过程:
- 确定对象的状态:选择需要保存的属性或字段。
- 转换为字节序列:将这些状态转换为字节序列,通常是通过某种编码方式。
1.1.2反序列化
反序列化是序列化的逆过程,即将字节序列恢复为对象的过程。在反序列化过程中,字节序列被重新构造为原来的对象,恢复其状态。
目的:
- 恢复对象状态:从文件、数据库或网络中读取字节序列,并将其转换回对象。
- 数据共享:在分布式系统中,接收方可以通过反序列化接收到的数据来恢复对象的状态。
过程:
- 读取字节序列:从存储介质或网络中读取字节序列。
- 构造对象:根据字节序列中的信息重新构造对象。
1.2 @JsonSerialize与@JsonDeserialize
@JsonSerialize
和 @JsonDeserialize
是 Jackson 库提供的注解,用于在序列化(将对象转换为 JSON 字符串)和反序列化(将 JSON 字符串转换为对象)过程中对特定字段进行自定义处理。这些注解允许你控制 JSON 数据的格式和内容,而不需要改变对象本身的数据结构。
1.2.1@JsonSerialize
@JsonSerialize
注解用于指定一个自定义的序列化器,该序列化器用于将 Java 对象转换成 JSON 字符串。当你需要在序列化过程中对某些字段进行特殊处理时,可以使用这个注解。
定义与用途:
- 定义:@JsonSerialize注解用于指定在将Java对象序列化为JSON字符串时使用的序列化器。
- 用途:通过该注解,开发者可以自定义序列化过程,如格式化日期、调整数字的小数位数、将枚举类型序列化为特定的字符串等。
使用场景:
- 当Java对象的某个属性需要按照特定的格式或逻辑进行序列化时,可以使用@JsonSerialize注解。
- 例如,将日期时间格式化为“yyyy-MM-dd HH:mm:ss”格式的字符串,或将金额从元转换为万元等。
使用方式:
- 可以将@JsonSerialize注解应用于字段、get方法或类级别。
- 通过using属性指定自定义的序列化器类。指定一个实现了
JsonSerializer
接口的类,用于处理字段的序列化。
例如:SexSerializer是自定义处理性别的序列化器
@Schema(name="sex",description=" 性别 ")@JsonSerialize(using = SexSerializer.class)private Integer sex;
1.2.2@JsonDeserialize
@JsonDeserialize
注解用于指定一个自定义的反序列化器,该反序列化器用于将 JSON 字符串转换成 Java 对象。当你需要在反序列化过程中对某些字段进行特殊处理时,可以使用这个注解。
定义与用途:
- 定义:@JsonDeserialize注解用于指定在将JSON字符串反序列化为Java对象时使用的反序列化器。
- 用途:通过该注解,开发者可以自定义反序列化过程,如将特定格式的字符串转换为日期对象、将JSON中的某个字段映射到Java对象的不同属性等。
使用场景:
- 当JSON数据的格式与Java对象的属性不完全匹配,或者需要按照特定的逻辑将JSON数据转换为Java对象时,可以使用@JsonDeserialize注解。
- 例如,将JSON中的“金额”字段从万元转换为元,或将自定义格式的日期字符串转换为Java的LocalDateTime对象等。
使用方式:
- 可以将@JsonDeserialize注解应用于字段、set方法或类级别。
- 通过using属性指定自定义的反序列化器类。指定一个实现了 JsonDeserializer接口的类,用于处理字段的序列化。
例如:UserAccountDeserializer是自定义处理用户账号的反序列化器
@Schema(name="account",description=" 账号 ")@JsonDeserialize(using= UserAccountDeserializer.class)private String account;
2.场景实现
2.1需求分析
(1)数据库中性别字段为数字,将性别转化为汉字给前端进行展示
(2)保存密码时,进行加密存储,查询时给它明文展示(这里只是举例查所有,真正的场景肯定不能这样搞)
开始分析:
(1)关于性别的转化、密码的明文展示。这俩基本一致,都是查询时给前端进行展示。那你想想,我们给前端进行展示,肯定涉及到了传输。那就是将我们的实体对象,转化成Json字符串的形式,那就是在Vo对象字段上加@JsonSerialize注解实现自定义序列化器来操作。
(2)关于密码的加密保存。那你想想,前端传给我们的肯定是明文,而且是Json串,我们将Json转化成java对象进行保存。那这个不就是反序列话操作吗。我们可以在入参Dto对象字段上加@JsonDeserialize注解实现自定义反序列化器来操作
那这里,可能有个疑问,从数据库中查出来,不也涉及到了,反序列化操作,将数据库对象映射成了java对象?保存时,不也涉及到了序列化操作,将java对象映射成Json串?是的没错,但是我这里用了mybatis-plus来实现,我查询了一下,mybatis-plus自带的crud他好像不一定会实现序列化与反序列化,就对导致我们的注解失效,所以这里我没在数据库entity实体上加@JsonSerialize和@JsonDeserialize注解)也有另一种实现方法,使用mybatis-plus支持的typeHandler的形式(typeHandler我在另一篇文章里去写)
2.2通用部分
2.2.1 Entity数据库实体,User对象
package com.zsh.test.swagger3test.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.zsh.test.swagger3test.handler.Sm4TypeHandler;
import lombok.Data;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;import java.io.Serializable;
import java.util.Date;/*** @Description * @Author ZhaoShuhao* @Date: 2024-07-21 12:45:39*/@Data
@Accessors(chain = true)
@Schema(name="用户信息")
@TableName(value = "user",autoResultMap = true)
public class User implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id",type = IdType.ASSIGN_ID)@Schema(name="id",description=" 主键 ")private Long id;@TableField(value = "name")@Schema(name="name",description=" 姓名 ")private String name;@TableField(value = "age")@Schema(name="age",description=" 年龄 ")private Integer age;@TableField(value = "phone")@Schema(name="phone",description=" 电话 ")private String phone;// @TableField(value = "account",typeHandler = Sm4TypeHandler.class)@Schema(name="account",description=" 账号 ")private String account;// @TableField(value = "pwd",typeHandler = Sm4TypeHandler.class)@Schema(name="pwd",description=" 密码 ")private String pwd;@TableField(value = "sex")@Schema(name="sex",description=" 性别 ")private Integer sex;@TableField(value = "creat_time")@Schema(name="reatTime",description=" 创建时间 ")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date creatTime;@TableField(value = "update_time")@Schema(name="updateTime",description=" 更新时间 ")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date updateTime;}
2.2.2 Vo实体,UserVo视图对象
package com.zsh.test.swagger3test.model.vo;import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.zsh.test.swagger3test.serializer.SexSerializer;
import com.zsh.test.swagger3test.serializer.UserPwdSerializertest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;/*** @Description * @Author ZhaoShuhao* @Date: 2024-07-21 12:45:39*/@Data
@Accessors(chain = true)
@Schema(name=" user ", description=" null ")
public class UserVo implements Serializable {private static final long serialVersionUID = 1L;@Schema(name="id",description=" 主键 ")private Long id;@Schema(name="name",description=" 姓名 ")private String name;@Schema(name="age",description=" 年龄 ")private Integer age;@Schema(name="phone",description=" 电话 ")private String phone;@Schema(name="account",description=" 账号 ")private String account;@Schema(name="pwd",description=" 密码 ")@JsonSerialize(using= UserPwdSerializertest.class)private String pwd;@Schema(name="sex",description=" 性别 ")@JsonSerialize(using = SexSerializer.class)private Integer sex;
}
2.2.3 Dto实体,UserDto入参对象
package com.zsh.test.swagger3test.model.dto;import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.zsh.test.swagger3test.serializer.UserPwdDeSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;import java.io.Serializable;/*** @Description * @Author ZhaoShuhao* @Date: 2024-07-21 12:45:39*/@Data
public class UserDto implements Serializable {private static final long serialVersionUID = 1L;@Schema(name="name",description=" 姓名 ")private String name;@Schema(name="age",description=" 年龄 ")private Integer age;@Schema(name="phone",description=" 电话 ")private String phone;@Schema(name="account",description=" 账号 ")private String account;@JsonDeserialize(using= UserPwdDeSerializer.class)@Schema(name="pwd",description=" 密码 ")private String pwd;@Schema(name="sex",description=" 性别 ")private Integer sex;
}
2.2.4 UserMapper
package com.zsh.test.swagger3test.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zsh.test.swagger3test.model.entity.User;
import org.apache.ibatis.annotations.Mapper;/**
* @author KeepHappy
* @description 针对表【user】的数据库操作Mapper
* @createDate 2024-07-21 12:55:52
* @Entity src/main/java/com/zsh/test/swagger3test.model.User
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {}
2.2.5 UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsh.test.swagger3test.mapper.UserMapper"></mapper>
2.2.6 UserService
package com.zsh.test.swagger3test.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zsh.test.swagger3test.model.dto.UserDto;
import com.zsh.test.swagger3test.model.entity.User;
import com.zsh.test.swagger3test.model.vo.UserVo;import java.util.List;/**
* @author KeepHappy
* @description 针对表【user】的数据库操作Service
* @createDate 2024-07-21 12:55:52
*/
public interface UserService extends IService<User> {}
2.2.7 UserServiceImpl
package com.zsh.test.swagger3test.service.impl;import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zsh.test.swagger3test.model.dto.UserDto;
import com.zsh.test.swagger3test.mapper.UserMapper;
import com.zsh.test.swagger3test.model.entity.User;
import com.zsh.test.swagger3test.model.vo.UserVo;
import com.zsh.test.swagger3test.service.UserService;
import io.swagger.v3.core.util.Json;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;/**
* @author KeepHappy
* @description 针对表【user】的数据库操作Service实现
* @createDate 2024-07-21 12:55:52
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}
2.3@JsonDeserialize的使用
UserDto入参对象:
@JsonDeserialize(using= UserPwdDeSerializer.class)
@Schema(name="pwd",description=" 密码 ")
private String pwd;
2.3.1 UserPwdDeSerializer密码加密反序列化器
package com.zsh.test.swagger3test.serializer;import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SM4;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;/*** 反序列化 对用户字段进去加密*/
public class UserPwdDeSerializer extends JsonDeserializer<String> {private static final Logger logger = LoggerFactory.getLogger(UserPwdDeSerializer.class);private static final String hexKey ="79C37CDBCD6FAB9D0619F511B2031234";@Overridepublic String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException {String text = jsonParser.getText();String enPwd = StrUtil.isBlank(text) ? "" : getEncryptInfo(text);return enPwd;}public static String getEncryptInfo(String value) {return getEncryptInfoSm4(value);}private static String getEncryptInfoSm4(String value){SM4 sm4 = new SM4(Mode.ECB, Padding.PKCS5Padding,ByteUtils.fromHexString(hexKey));return sm4.encryptHex(value);}}
2.3.2 UserController用户接口
package com.zsh.test.swagger3test.controller;import cn.hutool.core.bean.BeanUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zsh.test.swagger3test.config.Result;
import com.zsh.test.swagger3test.model.dto.UserDto;
import com.zsh.test.swagger3test.model.entity.User;
import com.zsh.test.swagger3test.model.vo.UserVo;
import com.zsh.test.swagger3test.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** @author ZhaoShuhao* @data 2024/7/21 15:12*/
@Tag(name = "用户接口")
@RestController
@RequestMapping("/user/api")
public class UserController {@Resourceprivate UserService userService;@PostMapping("/save")@Operation( summary= "添加用户信息")public Result saveUserInfo(@RequestBody List<UserDto> userList) {List<User> users = BeanUtil.copyToList(userList, User.class);boolean b = userService.saveBatch(users);return b ? Result.success() : Result.error("添加失败");}}
2.3.3 结果展示
2.4@JsonSerialize的使用
UserVo视图对象:
@Schema(name="pwd",description=" 密码 ")
@JsonSerialize(using= UserPwdSerializertest.class)
private String pwd;
@Schema(name="sex",description=" 性别 ")
@JsonSerialize(using = SexSerializer.class)
private Integer sex;
2.4.1SexSerializer性别转化序列化器
package com.zsh.test.swagger3test.serializer;import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;import java.io.IOException;/**序列化* @author ZhaoShuhao* @data 2024/7/25 23:30*/
public class SexSerializer extends JsonSerializer<Integer> {@Overridepublic void serialize(Integer integer, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {if (integer == 1) {jsonGenerator.writeString("男");} else if (integer == 2) {jsonGenerator.writeString("女");}else {jsonGenerator.writeString("未知");}}
}
2.4.2 UserPwdSerializertest密码解密序列化器
package com.zsh.test.swagger3test.serializer;import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.SM4;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.nio.charset.StandardCharsets;/*** 序列化 对用户字段进去解密*/
public class UserPwdSerializertest extends JsonSerializer<String> {private static final Logger logger = LoggerFactory.getLogger(UserPwdSerializertest.class);private static final String hexKey ="79C37CDBCD6FAB9D0619F511B2031234";@Overridepublic void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {String dePwd = StrUtil.isBlank(s) ? "" : deserializeText(s);jsonGenerator.writeString(dePwd);}public static String deserializeText(String text){return getDecryptInfoSm4(text) ;}private static String getDecryptInfoSm4(String value){try {SM4 sm4 = new SM4(Mode.ECB, Padding.PKCS5Padding,ByteUtils.fromHexString(hexKey));return sm4.decryptStr(value, StandardCharsets.UTF_8);}catch (Exception e){logger.error("解密数据{}",value);return value;}}}
2.4.5 UserController用户接口
package com.zsh.test.swagger3test.controller;import cn.hutool.core.bean.BeanUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zsh.test.swagger3test.config.Result;
import com.zsh.test.swagger3test.model.dto.UserDto;
import com.zsh.test.swagger3test.model.entity.User;
import com.zsh.test.swagger3test.model.vo.UserVo;
import com.zsh.test.swagger3test.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** @author ZhaoShuhao* @data 2024/7/21 15:12*/
@Tag(name = "用户接口")
@RestController
@RequestMapping("/user/api")
public class UserController {@Resourceprivate UserService userService;@PostMapping("/save")@Operation( summary= "添加用户信息")public Result saveUserInfo(@RequestBody List<UserDto> userList) {List<User> users = BeanUtil.copyToList(userList, User.class);boolean b = userService.saveBatch(users);return b ? Result.success() : Result.error("添加失败");}@PostMapping("/getAllUserInfo")@Operation(summary = "查询所有用户信息")public Result<List<UserVo>> getAllUserInfo(){List<User> list = userService.list();List<UserVo> userVos = BeanUtil.copyToList(list, UserVo.class);return Result.success((userVos));}
}
2.4.3 结果展示
相关文章:

关于@JsonSerialize序列化与@JsonDeserialize反序列化注解的使用(密码加密与解密举例)
注:另一种方式参考 关于TableField中TypeHandler属性,自定义的类型处理器的使用(密码加密与解密举例)http://t.csdnimg.cn/NZy4G 1.简介 1.1 序列化与反序列化 学习注解之前,我们可以先了解一下什么是序列化与反序列…...
第二届世界科学智能大赛逻辑推理赛道:复杂推理能力评估 #大模型技术之逻辑推理方向 #Datawhale #夏令营 <二>
第二届世界科学智能大赛逻辑推理赛道:复杂推理能力评估 #大模型技术之逻辑推理方向 #Datawhale #夏令营-CSDN博客 这里在上一篇的基础上,已经充分理解了一遍baseline的流程,并修复了一些后处理的问题,包括答案抽取,中间…...
C# 关于Linq延迟查询
demo: int Count 0;string[] obj { "item1", "item2", "item3", "item4", "item5", "item6" };var query obj.Where(item > IsTrue(item));// 第一次遍历foreach (var item in query){Console.WriteLine(it…...

Navicat For Mysql连接Mysql8.0报错:客户端不支持服务器请求的身份验证协议
windows通过navicat连接本地mysql时报错:Client does not support authentication protocol requested by server; consider upgrading MySQL client 一、问题原因二、解决方法1--失败1. 连接mysql客户端2. 修改加密方式3.正确的解决方法1.查找my.ini文件2.修改my.ini文件3.重…...

以西门子winCC为代表的组态界面,还是有很大提升空间的。
组态界面向来都是功能为主,美观和体验性为辅的,这也导致了国内的一些跟随者如法炮制,而且很多操作的工程师也是认可这重模式,不过现在一些新的组态软件可是支持精美的定制化界面,还有3D交互效果,这就是确实…...

HomeServer平台选择,介绍常用功能
平台选择 HomeServer 的性能要求不高,以下是我的硬件参数,可供参考: 硬件: 平台:旧笔记本CPU:i5 4210u内存 8G硬盘:128G 固态做系统盘,1T1T 机械盘组 RAID1 做存储。硬…...
记录一个k8s集群zookeeper部署过程
由于网管中心交维要求必须是支持高可用配置,原先单节点的zookeeper不被允许。所以在k8s集群中做了一个高可用版本的zookeeper。 期间有点小波折,官方给的镜像版本太老,业务不支持,所以手动做了下处理,重新打了一个镜像…...

TapData 信创数据源 | 国产信创数据库 TiDB 数据迁移指南,加速国产化进程,推进自主创新建设
随着国家对自主可控的日益重视,目前在各个行业和区域中面临越来越多的国产化,采用有自主知识产权的国产数据库正在成为主流。长期以来,作为拥有纯国产自研背景的 TapData,自是非常重视对于更多国产信创数据库的数据连接器支持&…...
开始写人工智能
文章目录 概述 概述 开始写人工智能模块。既然决定开始写这些,那就开始吧!...

盘点.软件测试模型
软件开发模型 软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。软件开发包括需求、设计、编码和测试等阶段,有时也包括维护阶段。 软件开发模型能清晰、直观地表达软件开发全过程,明确规定了要完成的主要活动…...

燃气安全无小事,一双专业劳保鞋让你步步安心!
燃气作为我们日常生活中不可或缺的能源之一,为我们的生活提供了极大便利,其安全性往往被忽视在忙碌的日常生活背后。然而,燃气事故一旦发生,后果往往不堪设想,轻则财产损失,重则危及生命。因此,…...

springboot校园服装租赁系统-计算机毕业设计源码30824
目 录 摘要 1 绪论 1.1 研究背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 校园服装租赁系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例…...

线性回归和逻辑回归揭示数据的隐藏模式:理论与实践全解析
机器学习之线性回归和逻辑回归 1. 简介1.1 机器学习概述1.2 监督学习的定义与重要性1.3 线性回归和逻辑回归在监督学习中的作用1.3.1 线性回归1.3.2 逻辑回归 2. 线性回归(Linear Regression)2.1 定义与目标2.1.1 回归问题的定义2.1.2 预测连续目标变量 …...
掌握采购询价软件:高效比较供应商报价的技巧
在企业运营中,获取所需的产品往往是一项复杂且耗时的任务,这涉及多个环节和流程。然而,借助电子采购询价(RFQ)系统,许多原本需要采购员手动完成的任务可以自动化运行,从而提高了效率。 那么问题…...

AMQP-核心概念-终章
本文参考以下链接摘录翻译: https://www.rabbitmq.com/tutorials/amqp-concepts 连接(Connections) AMQP 0-9-1连接通常是长期保持的。AMQP 0-9-1是一个应用级别的协议,它使用TCP来实现可靠传输。连接使用认证且可以使用TLS保护…...

在WPF中使用WebView2详解
Microsoft Edge WebView2 Microsoft Edge WebView2 控件允许在本机应用中嵌入 web 技术(HTML、CSS 以及 JavaScript)。 WebView2 控件使用 Microsoft Edge 作为绘制引擎,以在本机应用中显示 web 内容。 使用 WebView2 可以在本机应用的不同部分嵌入 Web 代码&…...
僵尸进程的例子
以下是一个简单的C语言程序示例,该程序将创建一个子进程,然后子进程退出,但是父进程不会调用wait()或waitpid()来回收子进程的状态,从而使得子进程成为僵尸进程。 #include <stdio.h> #include <stdlib.h> #include …...

消息中间件分享
消息中间件分享 1 为什么使用消息队列2 消息队列有什么缺点3 如何保证消息队列的高可用4 如何处理消息丢失的问题?5 如何保证消息的顺序性1 为什么使用消息队列 解耦、异步、削峰 解耦 不使用中间件的场景 使用中间件的场景 异步 不使用中间件 使用中间件 削峰 不使…...
12. kubernetes调度——污点Taint和容忍Toleration
kubernetes调度——污点Taint和容忍Toleration 一、通过节点属性调度1、节点名称2、节点标签2.1 查看节点标签2.2 添加标签2.3 修改标签2.4 删除标签2.5 通过节点标签进行调度 二、污点Taint和容忍Toleration1、污点Taint1.1 查看Master节点的污点1.2 添加污点1.3 删除污点 2、…...

第100+18步 ChatGPT学习:R实现SVM分类
基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言,不想学Python咯。 答曰:可!用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了,就帮各位搬运一下吧。 二、R代码实现SVM分类 (1&a…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...