Jackson @JsonSerialize注解深度解析:自定义序列化实战与性能优化
1. 项目概述为什么我们需要关注 JsonSerialize在Java后端开发中对象与JSON字符串之间的转换是日常操作。无论是API接口的响应还是数据存储前的处理序列化将对象转为JSON和反序列化将JSON转为对象都扮演着核心角色。Jackson作为这个领域事实上的标准库其强大之处不仅在于默认行为足够智能更在于它提供了丰富的注解让我们能对序列化过程进行精细化的控制。而JsonSerialize注解就是这把手术刀中最锋利的一把。简单来说JsonSerialize允许你告诉Jackson“当序列化这个字段或这个类时不要用你默认的那套逻辑按我指定的方式来。” 这解决了大量现实问题一个BigDecimal金额字段你希望始终格式化为两位小数一个Date类型的生日字段你希望输出为“yyyy-MM-dd”格式而非默认的时间戳一个枚举类型你希望序列化的是其desc属性而非name()甚至当一个字段为null时你希望给它一个默认值而不是直接忽略或输出null。如果你曾遇到过API返回的金额格式不一致、日期可读性差、或者前端抱怨null值处理麻烦那么深入理解JsonSerialize就是你必须要补上的一课。它不仅仅是解决一个技术点更是提升代码健壮性、保证数据一致性和提升开发体验的关键。本文将从实战出发拆解JsonSerialize的每一个核心用法并结合我踩过的坑分享如何高效、安全地使用它。2. JsonSerialize 注解核心能力全解析JsonSerialize注解主要作用于两个层面类级别和属性字段/Getter方法级别。它的核心能力通过其包含的属性来定义理解这些属性是灵活运用的前提。2.1 注解的主要属性及其含义JsonSerialize提供了多个属性最常用、最核心的是以下几个using: 这是最强大、最灵活的属性。它允许你指定一个自定义的序列化器JsonSerializer的子类。当Jackson序列化被注解的元素时它会完全委托给你提供的这个自定义序列化器来处理。这是实现复杂、非标准序列化逻辑的终极方案。contentUsing: 当被注解的字段是一个容器如ListT,MapString, T时using控制的是整个容器的序列化方式。而contentUsing则专门用于控制容器内每个元素的序列化方式。例如一个ListDate你可以用contentUsing来指定日期元素的格式化方式。keyUsing: 专门用于Map类型。它控制Map的键Key的序列化方式。比如你有一个MapMyKeyEnum, Object你可以通过keyUsing来指定如何将MyKeyEnum序列化为JSON对象的键名。nullsUsing: 专门用于处理null值。当被注解的字段值为null时Jackson会使用你指定的序列化器来决定输出什么。通常用于将null转换为空字符串、特定数字0或一个默认对象{}。as: 这是一个类型转换提示。它告诉Jackson在序列化时将字段视为指定的类型。Jackson会尝试寻找或使用该指定类型的默认序列化器。这常用于将复杂对象序列化为其某个简单属性。例如将一个User对象序列化为其idLong类型。2.2 使用场景与经典案例匹配理解属性后我们将其映射到具体场景就能明白该如何选择场景一自定义日期/数字格式需求将Date输出为 “2023-10-27”将BigDecimal输出为保留两位小数的字符串。方案使用using属性指定Jackson内置的格式化序列化器如JsonSerializer的子类但更常见的做法是配合JsonFormat注解。实际上对于简单的格式化JsonFormat(pattern “yyyy-MM-dd”)是更简洁的选择它底层也利用了JsonSerialize的机制。但对于更复杂的逻辑如根据时区动态格式化using仍是首选。场景二枚举序列化自定义需求枚举类通常有code和desc属性希望序列化时输出code而非枚举实例名。方案在枚举字段上使用using指定一个自定义序列化器该序列化器重写serialize方法返回枚举的getCode()值。场景三处理空值Null需求所有字符串类型的null值在JSON中希望表示为空字符串所有数值类型的null希望表示为0。方案使用nullsUsing属性。你可以为不同类型字段配置不同的空值序列化器。例如为字符串字段配置JsonSerializer的匿名类在serialize方法中返回JsonStringSerializer实例来处理空字符串。场景四简化对象序列化需求一个Order对象中有一个User类型的owner字段在订单列表接口中只需要返回用户的ID和姓名而不是完整的用户信息。方案在owner字段上使用as属性可能不够灵活。更常见的做法是使用using指定一个自定义序列化器或者使用JsonSerialize的另一种思路创建OrderVOView Object视图对象在VO中直接定义Long ownerId和String ownerName字段并通过工具类或构造函数从Order对象中赋值。后者在复杂场景下更清晰但using在快速修改现有实体时非常有用。场景五容器内元素自定义需求一个MapString, ListSensorData类型的数据其中SensorData的value字段需要特殊处理。方案在SensorData类上使用JsonSerialize定义其序列化方式。如果这个Map字段本身也需要处理可以在该字段上同时使用using处理整个Map和contentUsing处理ListSensorData但contentUsing会覆盖SensorData类上的注解。这里需要理清优先级。注意JsonSerialize的配置具有优先级。字段/方法上的注解优先级高于类上的注解。using等具体属性的设置会完全覆盖Jackson的默认行为。当同时使用JsonSerialize和其他Jackson注解如JsonFormat时行为可能以其中一个为准需要测试确认最佳实践是避免混用功能重叠的注解。3. 实战手把手实现自定义序列化器理论说再多不如一行代码。自定义序列化器是JsonSerialize的灵魂玩法。我们通过两个最典型的案例来掌握它。3.1 案例一优雅处理金额与日期格式化假设我们有一个Product类包含价格和上架时间。import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.math.BigDecimal; import java.util.Date; public class Product { private String name; // 案例1: 将BigDecimal格式化为两位小数字符串 JsonSerialize(using MoneySerializer.class) private BigDecimal price; // 案例2: 将Date格式化为yyyy-MM-dd HH:mm:ss JsonSerialize(using CustomDateSerializer.class) private Date shelfTime; // 省略 getters/setters 和构造函数 }现在我们来创建两个自定义序列化器。MoneySerializer.javaimport com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; public class MoneySerializer extends JsonSerializerBigDecimal { Override public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value null) { // 处理null值可以输出null或者输出0.00 gen.writeNull(); // gen.writeString(0.00); // 另一种选择 } else { // 核心逻辑四舍五入保留两位小数并转为字符串 // 使用 setScale 并指定舍入模式避免精度丢失和科学计数法 String formatted value.setScale(2, RoundingMode.HALF_UP).toPlainString(); gen.writeString(formatted); } } }CustomDateSerializer.javaimport com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class CustomDateSerializer extends JsonSerializerDate { // 定义日期格式考虑线程安全每次调用创建新实例或使用ThreadLocal private static final String PATTERN yyyy-MM-dd HH:mm:ss; Override public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value null) { gen.writeNull(); return; } SimpleDateFormat sdf new SimpleDateFormat(PATTERN); // 重要设置时区通常使用UTC或系统默认避免时区问题导致前端显示错误 sdf.setTimeZone(TimeZone.getTimeZone(UTC)); // 或 TimeZone.getDefault() String formatted sdf.format(value); gen.writeString(formatted); } }实操心得舍入模式选择在MoneySerializer中我使用了RoundingMode.HALF_UP四舍五入。在金融场景中务必与业务方确认舍入规则HALF_EVEN银行家舍入法也可能是要求。toPlainString()的重要性一定要用toPlainString()而不是toString()。对于BigDecimal很大或很小的数toString()可能会输出科学计数法如1E3这是API接口的大忌。toPlainString()保证输出纯数字字符串。时区陷阱在CustomDateSerializer中显式设置TimeZone至关重要。服务器默认时区可能与业务期望不符如中国是Asia/Shanghai。一个常见的做法是统一使用UTC时间戳进行存储和传输由前端根据用户时区进行渲染。如果必须传格式化字符串那么明确时区是避免前后端扯皮的关键。性能考量SimpleDateFormat是非线程安全的。在高并发场景下每次创建新实例会有开销。可以使用ThreadLocalSimpleDateFormat进行优化为每个线程缓存一个实例。3.2 案例二枚举序列化与空值兜底策略枚举和空值处理是API设计中的高频需求。StatusEnum.javapublic enum StatusEnum { DRAFT(0, 草稿), PUBLISHED(1, 已发布), DELETED(2, 已删除); private final int code; private final String desc; StatusEnum(int code, String desc) { this.code code; this.desc desc; } // getters... }Order.javaimport com.fasterxml.jackson.databind.annotation.JsonSerialize; public class Order { private String orderNo; // 枚举序列化输出code而非name JsonSerialize(using EnumCodeSerializer.class) private StatusEnum status; // 空值处理null - 空字符串 JsonSerialize(nullsUsing NullToStringSerializer.class) private String remark; // 省略 getters/setters }EnumCodeSerializer.java(泛型版可复用)import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; public class EnumCodeSerializer extends JsonSerializerEnum? { Override public void serialize(Enum? value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value null) { gen.writeNull(); return; } // 这里假设枚举都有一个叫 getCode 的方法。实际情况可能需要接口约束。 // 这是一种反射调用性能有损耗但通用性强。 try { Object code value.getClass().getMethod(getCode).invoke(value); if (code instanceof Number) { gen.writeNumber(((Number) code).intValue()); // 根据code实际类型调整 } else { gen.writeObject(code); } } catch (Exception e) { // 如果反射失败降级为序列化枚举名 gen.writeString(value.name()); } } }NullToStringSerializer.javaimport com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; public class NullToStringSerializer extends JsonSerializerObject { Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 当字段值为null时调用此方法。我们将其序列化为空字符串。 gen.writeString(); } }更优的枚举处理方案 上面的反射方案通用但性能稍差。更优雅的做法是让所有需要序列化为code的枚举实现一个公共接口。public interface CodeEnum { Integer getCode(); } public enum StatusEnum implements CodeEnum { DRAFT(0, 草稿); // ... 其他 Override public Integer getCode() { return this.code; } } // 序列化器修改为只处理 CodeEnum public class EnumCodeSerializer extends JsonSerializerCodeEnum { Override public void serialize(CodeEnum value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value null) { gen.writeNull(); } else { gen.writeNumber(value.getCode()); } } }这样既安全又高效。对于空值处理NullToStringSerializer需要小心使用因为它会将任何类型的null都转为空字符串。对于数值字段你可能需要专门的NullToZeroSerializer。更好的全局配置是使用ObjectMapper的setSerializationInclusion(JsonInclude.Include.NON_NULL)来忽略所有null字段或者用NON_ABSENT、NON_EMPTY等策略这比在每个字段上注解更统一。4. 高级应用与性能优化考量掌握了基础用法后我们来看看如何将JsonSerialize用在更复杂的场景并关注其性能影响。4.1 处理复杂嵌套对象与集合当对象结构复杂时JsonSerialize可以组合使用。场景一个Dashboard对象包含一个MapString, Widget。每个Widget有一个Config对象我们需要自定义Config的序列化逻辑。public class Dashboard { JsonSerialize(contentUsing WidgetSerializer.class) // 控制Map值的序列化 private MapString, Widget widgets; } public class Widget { private String id; JsonSerialize(using ConfigSerializer.class) // 控制Config字段的序列化 private Config config; }这里Dashboard的widgets字段使用了contentUsing这意味着Map里的每一个Widget值都会用WidgetSerializer来序列化。而Widget内部的config字段又用了自己的ConfigSerializer。序列化器是可以嵌套的。重要提示contentUsing和keyUsing的优先级很高。一旦在容器字段上指定了contentUsing容器内元素类如Widget上定义的JsonSerialize注解将不会生效因为序列化入口被contentUsing指定的序列化器接管了。这一点在调试时很容易被忽略。4.2 全局配置与注解的优先级虽然JsonSerialize很灵活但遍地开花的注解会让代码显得杂乱。对于一些通用规则全局配置是更好的选择。通过 ObjectMapper 进行全局配置ObjectMapper mapper new ObjectMapper(); // 1. 全局设置日期格式 mapper.setDateFormat(new SimpleDateFormat(yyyy-MM-dd)); // 2. 全局忽略null值 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 3. 注册全局的序列化器/反序列化器模块 SimpleModule module new SimpleModule(); module.addSerializer(BigDecimal.class, new MoneySerializer()); // 为所有BigDecimal注册 module.addSerializer(StatusEnum.class, new EnumCodeSerializer()); // 为所有StatusEnum注册 mapper.registerModule(module);优先级规则从高到低字段/方法上的JsonSerialize注解。类上的JsonSerialize注解。通过ObjectMapper注册的全局序列化器SimpleModule。Jackson提供的默认序列化器。最佳实践建议对于项目内高度统一的规则如所有金额格式化、所有日期格式、所有枚举序列化优先考虑通过ObjectMapper全局配置或注册模块。这减少了注解污染也便于统一修改。对于特定业务实体的特殊需求再使用JsonSerialize注解。两者结合既保持了整洁又满足了灵活性。4.3 性能陷阱与优化建议自定义序列化器会带来一定的性能开销尤其是在高并发API中。避免在序列化器中做耗时操作序列化器的serialize方法会被频繁调用。严禁在其中执行数据库查询、远程RPC调用、复杂的文件IO等操作。它的职责应纯粹是数据转换。缓存序列化器实例Jackson默认会为每个需要自定义序列化的类型创建序列化器实例。确保你的序列化器是无状态且线程安全的。如果序列化器内部有昂贵的初始化如加载模板、创建复杂格式化对象考虑使用静态缓存或ThreadLocal。慎用反射如前文枚举案例所示反射调用getMethod().invoke()比直接方法调用慢得多。如果可能使用接口约束如CodeEnum来避免反射。评估是否真的需要自定义序列化有时候使用多个DTOData Transfer Object来适配不同的视图比在一个实体上通过复杂的序列化逻辑来实现更简单、更清晰且性能往往更好。例如为列表页创建一个OrderListVO为详情页创建一个OrderDetailVO在Service层或通过MapStruct等工具进行转换将序列化逻辑从Jackson注解中解放出来。5. 常见问题排查与调试技巧在实际使用中你肯定会遇到序列化结果不符合预期的情况。下面是一些常见问题的排查思路。5.1 注解不生效检查这些地方Getter/Setter 方法覆盖JsonSerialize可以放在字段上也可以放在对应的Getter方法上。如果两者都放了以Getter方法上的为准。检查是否有其他Getter方法如 Lombok 生成的意外覆盖了你的注解。父子类注解继承默认情况下Jackson注解是不被继承的。如果父类字段有JsonSerialize子类不会自动继承。需要在父类的字段上使用JsonProperty等注解或者通过JsonSerialize的Inherited元注解但Jackson自己的注解大多不支持。更常见的做法是在子类中重新定义。混合使用其他注解导致冲突同时使用JsonSerialize和JsonFormat、JsonProperty等可能会产生未定义行为。例如JsonFormat也有自己的序列化逻辑。最好只使用一种方式。全局配置覆盖检查项目中是否通过ObjectMapper配置了全局的序列化模块或特性这些配置可能会覆盖或干扰字段级别的注解。序列化器未正确注册如果你是通过SimpleModule将自定义序列化器注册到ObjectMapper确保这个ObjectMapper实例确实被用于序列化当前对象。在Spring Boot中默认的ObjectMapperBean可能被自定义配置修改。5.2 序列化结果异常调试清单当输出JSON不是你想要的可以按以下步骤排查问题现象可能原因排查步骤字段完全缺失1. 字段值为null且配置了NON_NULL。2. 没有公共的Getter方法。3. 字段被JsonIgnore标记。1. 检查字段值调整ObjectMapper的SerializationInclusion策略。2. 确保有public getXxx()方法。3. 检查类及父类是否有忽略注解。字段值为null1. 字段本身为null。2. 自定义序列化器在值为null时写了null。1. 检查数据源。2. 在自定义序列化器的serialize方法中检查对null的处理逻辑。格式不正确如日期为时间戳1.JsonSerialize注解未生效。2. 自定义序列化器逻辑错误。3. 全局日期格式配置冲突。1. 使用调试器在自定义序列化器的serialize方法打断点看是否执行。2. 检查序列化器代码逻辑。3. 检查是否有多个ObjectMapper配置。集合/Map内部元素未按预期序列化1. 在容器字段上使用了using而非contentUsing/keyUsing。2.contentUsing指定的序列化器覆盖了元素类自身的注解。1. 确认注解属性使用正确。2. 将元素类的序列化逻辑移到contentUsing指定的序列化器中或移除contentUsing改用元素类注解。性能显著下降1. 自定义序列化器中有耗时操作。2. 序列化器创建频繁如包含重量级初始化。3. 过度使用反射。1. 审查serialize方法代码。2. 将序列化器设计为无状态单例或使用ThreadLocal缓存资源。3. 用接口代替反射。5.3 利用 Jackson 的ObjectMapper进行调试在测试或开发阶段可以通过ObjectMapper的配置来输出更多信息帮助调试。ObjectMapper debugMapper new ObjectMapper(); // 启用美化输出便于阅读 debugMapper.enable(SerializationFeature.INDENT_OUTPUT); // 禁用将日期写为时间戳让日期格式问题暴露出来 debugMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); String json debugMapper.writeValueAsString(yourObject); System.out.println(json); // 更高级注册一个用于调试的模块打印序列化过程 SimpleModule debugModule new SimpleModule(); debugModule.setSerializerModifier(new BeanSerializerModifier() { Override public JsonSerializer? modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer? serializer) { System.out.println(Serializing bean: beanDesc.getBeanClass()); return serializer; } }); debugMapper.registerModule(debugModule);此外在自定义序列化器中加入日志也是常用的调试手段但记得在生产环境关闭这些调试日志。6. 与替代方案的对比及选型建议JsonSerialize并非处理序列化的唯一方式。了解其他方案有助于我们在不同场景下做出最佳选择。6.1 JsonSerialize vs. JsonFormatJsonFormat: 主要用于简单的格式化特别是日期、时间、数字。它更声明式配置简单。JsonFormat(pattern yyyy-MM-dd, timezone GMT8) private Date birthDate;优点简洁内置支持无需写序列化器类。缺点功能单一只能用于格式化无法实现复杂逻辑。JsonSerialize: 功能全面可以实现任何自定义逻辑。优点功能强大、灵活是解决复杂序列化需求的终极武器。缺点需要编写额外的序列化器类稍显繁琐。选型建议如果只是简单的日期、数字格式化优先使用JsonFormat。如果需要处理null值、自定义枚举输出、根据条件动态决定输出内容等复杂逻辑则必须使用JsonSerialize。6.2 JsonSerialize vs. 自定义DTO/VO这是架构层面的选择。DTO/VO模式为不同的API接口或视图创建专门的数据传输对象。在Service层或Controller层将实体对象转换为VO。优点职责清晰实体类负责业务逻辑和持久化VO负责展示。高度可控转换逻辑在Java代码中易于调试、测试和复用。避免注解污染实体类保持干净不掺杂展示层逻辑。性能优化可以精确控制VO中包含的字段避免序列化不必要的嵌套数据即解决N1查询问题在序列化层面的体现。缺点需要创建和维护大量的类增加了代码量。JsonSerialize注解模式将展示逻辑以注解形式附着在实体类上。优点便捷改动小对于快速原型或简单项目非常有效。缺点污染实体将视图逻辑耦合到了领域模型中。难以复用同一个实体在不同接口可能需要不同的序列化方式注解难以动态调整。逻辑隐蔽序列化逻辑分散在注解和序列化器类中不如Java代码直观。选型建议对于中大型项目尤其是领域驱动设计DDD项目强烈推荐使用 DTO/VO 模式。它带来了更好的分层和可维护性。JsonSerialize更适合用于处理一些全局的、通用的、与具体业务视图无关的格式化规则例如全局的金额格式化、全局的枚举code输出等。或者在遗留代码中进行局部修复和优化时作为临时方案。6.3 组合使用发挥最大威力在实际项目中往往是组合拳。例如在全局ObjectMapper中注册通用的MoneySerializer和EnumCodeSerializer。在特定的实体类字段上使用JsonFormat处理简单的日期格式。对于极个别有特殊复杂逻辑的字段使用JsonSerialize(using ...)。在Controller层定义清晰的API响应对象如ResultT其中T是对应的VOVO通过工具类从实体转换而来。这套组合策略既能保证项目的整洁和可维护性又能利用Jackson注解的便利性处理一些通用问题。最终目标是让序列化逻辑清晰、高效且易于变更。

相关新闻

学术PPT模板高效应用指南:从红棕复古风模板到专业开题报告

学术PPT模板高效应用指南:从红棕复古风模板到专业开题报告

这次我们来看一个专门为学术场景设计的PPT模板项目——“红棕复古高级风学术论文开题报告PPT模板”。对于研究生、博士生以及需要进行正式学术汇报的科研人员来说,一份专业、美观且符合学术规范的PPT至关重要。这个模板项目直接瞄准了这一需求,它不是一个…

2026/10/19 6:54:10 阅读更多 →
Jackson @JsonSerialize 注解详解:自定义序列化实战指南

Jackson @JsonSerialize 注解详解:自定义序列化实战指南

1. 项目概述:为什么我们需要关注 JsonSerialize在 Java 后端开发中,尤其是构建 RESTful API 时,对象与 JSON 之间的序列化与反序列化是日常操作。Jackson 作为事实上的标准库,其默认行为已经足够智能,能处理大部分常见…

2026/10/16 4:46:02 阅读更多 →
从智己车机故障看智能汽车软件可靠性:OTA、域控制器与质量保障体系

从智己车机故障看智能汽车软件可靠性:OTA、域控制器与质量保障体系

1. 项目概述:从一次大规模车机故障看智能汽车的“软肋” 最近,智己汽车因为一次大规模的车机系统故障,被推上了风口浪尖。事件的起因是,不少车主发现自己的车辆在行驶或驻车状态下,车机屏幕突然黑屏、卡死,…

2026/10/16 4:46:11 阅读更多 →

最新新闻

计算机考研复试第30天:补齐基础概念、机试手感与面试表达

计算机考研复试第30天:补齐基础概念、机试手感与面试表达

1. 第30天的“补”,到底该补什么计算机复试准备到第30天,其实已经到了一个很微妙的阶段:初试那种“天天背、天天刷题”的节奏早就失效了,而复试又不像初试那样有一条一眼能看到头的复习主线。我把这一天的笔记标成“补”&#xff…

2026/10/19 6:54:02 阅读更多 →
数据库内核实践:实现LRU缓冲池与并发控制全复盘

数据库内核实践:实现LRU缓冲池与并发控制全复盘

某高校软件学院数据库系统实验四,终于在我把一个周末加两晚搭进去之后提交了。这轮实验和前面三次完全不是一个画风:前几轮还在调SQL、画ER图、写存储过程,到了第四次,需求文档里明明白白写着「实现一个支持LRU置换与并发访问的缓…

2026/10/19 6:54:02 阅读更多 →
如何让 flux2-klein-9B 出图更快?显卡显存优化与推理调优终极指南

如何让 flux2-klein-9B 出图更快?显卡显存优化与推理调优终极指南

【免费下载链接】flux2-klein-9B 项目地址: https://ai.gitcode.com/hf_mirrors/Comfy-Org/flux2-klein-9B 点击查看 免费下载 flux2-klein-9B 是 ComfyUI 官方为 FLUX.2-klein-9B 重打包的模型文件仓库,提供全精度、FP8 与 FP4 混合精度三种文本编码器…

2026/10/19 6:54:02 阅读更多 →
VisualPRM-8B数据揭秘:VisualPRM400K自动化管线如何构建多模态过程监督数据集

VisualPRM-8B数据揭秘:VisualPRM400K自动化管线如何构建多模态过程监督数据集

【免费下载链接】VisualPRM-8B 项目地址: https://ai.gitcode.com/OpenGVLab/VisualPRM-8B 点击查看 免费下载 📊 本文带你揭秘 VisualPRM-8B 背后的训练数据:VisualPRM400K 多模态过程监督数据集。它由一条全自动的 VisualPRM400K 自动化数…

2026/10/19 6:54:02 阅读更多 →
具身智能中的无线技术——无线线束2

具身智能中的无线技术——无线线束2

本文对比了车载与具身智能领域六种有线(LIN、CAN/CANFD、FlexRay、车载以太网、SerDes、A2B)与九种无线短距通信技术(BLE、星闪、Wi-Fi、UWB等),并基于通信距离、带宽、延迟、同步精度、功耗等维度进行综合分析。提出“…

2026/10/19 6:54:02 阅读更多 →
一文读懂Qwen3.6-35B-A3B-Quark-INT4-G128:MoE大模型INT4量化的完整入门指南

一文读懂Qwen3.6-35B-A3B-Quark-INT4-G128:MoE大模型INT4量化的完整入门指南

【免费下载链接】Qwen3.6-35B-A3B-Quark-INT4-G128 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Qwen3.6-35B-A3B-Quark-INT4-G128 点击查看 免费下载 Qwen3.6-35B-A3B-Quark-INT4-G128 是用 Quark INT4 W4A16 方案对 Qwen3.6-35B-A3B 这个 MoE 多模态大模型…

2026/10/19 6:53:02 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →