当前位置: 首页 > news >正文

技术速递|.NET 9 中 System.Text.Json 的新增功能

作者:Eirik Tsarpalis - 首席软件工程师

排版:Alan Wang

System.Text.Json 的9.0 版本包含许多功能,主要侧重于 JSON 架构和智能应用程序支持。它还包括一些备受期待的增强功能,例如可空引用类型支持、自定义枚举成员名称、无序元数据反序列化和自定义序列化缩进。

获取最新信息

您可以通过引用 System.Text.Json NuGet 包的最新版本或 .NET 9 的最新 SDK来尝试新功能。

JSON 架构导出器

新的 JsonSchemaExporter 类可以使用 JsonSerializerOptions 或 JsonTypeInfo 实例从 .NET 类型中提取 JSON 架构文档:

using System.Text.Json.Schema;
JsonSerializerOptions options = JsonSerializerOptions.Default;
JsonNode schema = options.GetJsonSchemaAsNode(typeof(Person));
Console.WriteLine(schema.ToString());
//{
//  "type": ["object", "null"],
//  "properties": {
//    "Name": { "type": "string" },
//    "Age": { "type": "integer" },
//    "Address": { "type": ["string", "null"], "default": null }
//  },
//  "required": ["Name", "Age"]
//}
record Person(string Name, int Age, string? Address = null);

生成的模式为该类型提供了 JSON 序列化契约的规范。从这个例子中可以看出,它区分了可空属性和不可空属性,并根据构造函数参数是否可选来填充“required”关键字。模式的输出可以通过在 JsonSerializerOptions 或 JsonTypeInfo 实例中指定的配置进行影响:

JsonSerializerOptions options = new(JsonSerializerOptions.Default)
{PropertyNamingPolicy = JsonNamingPolicy.KebabCaseUpper,NumberHandling = JsonNumberHandling.WriteAsString,UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow,
};
JsonNode schema = options.GetJsonSchemaAsNode(typeof(MyPoco));
Console.WriteLine(schema.ToString());
//{
//  "type": ["object", "null"],
//  "properties": {
//    "NUMERIC-VALUE": {
//      "type": ["string", "integer"],
//      "pattern": "^-?(?:0|[1-9]\\d*)$"
//    }
//  },
//  "additionalProperties": false
//}
class MyPoco
{public int NumericValue { get; init; }
}

用户可以使用 JsonSchemaExporterOptions 配置类型进一步控制生成的模式:

JsonSerializerOptions options = JsonSerializerOptions.Default;
JsonSchemaExporterOptions exporterOptions = new()
{// 将根级类型标记为不可空TreatNullObliviousAsNonNullable = true,
};
JsonNode schema = options.GetJsonSchemaAsNode(typeof(Person), exporterOptions);
Console.WriteLine(schema.ToString());
//{
//  "type": "object",
//  "properties": {
//    "Name": { "type": "string" }
//  },
//  "required": ["Name"]
//}
record Person(string Name);

最后,用户可以通过指定 TransformSchemaNode 委托, 对生成的架构节点应用自己的转换。以下是包含来自 DescriptionAttribute 注释的文本的示例:

JsonSchemaExporterOptions exporterOptions = new()
{TransformSchemaNode = (context, schema) =>{// 确定类型或属性并提取相关属性提供程序ICustomAttributeProvider? attributeProvider = context.PropertyInfo is not null? context.PropertyInfo.AttributeProvider: context.TypeInfo.Type;//查找任何描述属性DescriptionAttribute? descriptionAttr = attributeProvider?.GetCustomAttributes(inherit: true).Select(attr => attr as DescriptionAttribute).FirstOrDefault(attr => attr is not null);//将描述属性应用于生成的架构if (descriptionAttr != null){if (schema is not JsonObject jObj){// 处理架构为布尔值的情况JsonValueKind valueKind = schema.GetValueKind();Debug.Assert(valueKind is JsonValueKind.True or JsonValueKind.False);schema = jObj = new JsonObject();if (valueKind is JsonValueKind.False){jObj.Add("not", true);}}jObj.Insert(0, "description", descriptionAttr.Description);}return schema;}
};

综合以上内容,我们现在可以生成一个包含来自属性注释的 description 关键字源的模式:

JsonNode schema = options.GetJsonSchemaAsNode(typeof(Person), exporterOptions);
Console.WriteLine(schema.ToString());
//{
//  "description": "A person",
//  "type": ["object", "null"],
//  "properties": {
//    "Name": { "description": "The name of the person", "type": "string" }
//  },
//  "required": ["Name"]
//}
[Description("A person")]
record Person([property: Description("The name of the person")] string Name);

在为 .NET 方法或 API 生成架构时,这是一个特别有用的组件;它被用于支持 ASP.NET Core 最新发布的 OpenAPI 组件,并且我们已将其部署到许多具有工具调用要求的 AI 相关库和应用程序中,例如 Semantic Kernel、Visual Studio Copilot 和最新发布的 Microsoft.Extensions.AI 库。

流式处理多个 JSON 文档

Utf8JsonReader 现在支持从单个缓冲区或流中读取多个以空格分隔的 JSON 文档。默认情况下,如果 Utf8JsonReader 检测到第一个顶级文档后面有任何非空格字符,它将抛出 异常。这可以使用 JsonReaderOptions.AllowMultipleValues 标志来改变:

JsonReaderOptions options = new() { AllowMultipleValues = true };
Utf8JsonReader reader = new("null {} 1 \r\n [1,2,3]"u8, options);
reader.Read();
Console.WriteLine(reader.TokenType); // Null
reader.Read();
Console.WriteLine(reader.TokenType); // StartObject
reader.Skip();
reader.Read();
Console.WriteLine(reader.TokenType); // Number
reader.Read();
Console.WriteLine(reader.TokenType); // StartArray
reader.Skip();
Console.WriteLine(reader.Read()); // False

此外,这还使得从可能包含无效 JSON 尾部数据的有效负载中读取 JSON 成为可能:

Utf8JsonReader reader = new("[1,2,3]    <NotJson/>"u8, new() { AllowMultipleValues = true });
reader.Read();
reader.Skip(); // Success
reader.Read(); // throws JsonReaderExceptionUtf8JsonReader reader = new("[1,2,3]   "u8, new() { AllowMultipleValues = true });

在流式反序列化方面,我们添加了新的 JsonSerializer.DeserializeAsyncEnumerable 重载,使流式处理多个顶级值成为可能。默认情况下,DeserializeAsyncEnumerable 将尝试流式处理顶级 JSON 数组中包含的元素。这可以使用新的 topLevelValues 标志切换:

ReadOnlySpan<byte> utf8Json = """[0] [0,1] [0,1,1] [0,1,1,2] [0,1,1,2,3]"""u8;
using var stream = new MemoryStream(utf8Json.ToArray());
await foreach (int[] item in JsonSerializer.DeserializeAsyncEnumerable<int[]>(stream, topLevelValues: true))
{Console.WriteLine(item.Length);
}

遵循可 null 注释

JsonSerializer 现在为序列化和反序列化中的非空引用类型强制增加了有限的支持。这可以使用 RespectNullableAnnotations 标志进行切换:

#nullable enable
JsonSerializerOptions options = new() { RespectNullableAnnotations = true };MyPoco invalidValue = new(Name: null!);
JsonSerializer.Serialize(invalidValue, options);
// System.Text.Json.JsonException:类型“MyPoco”上的属性或字段“Name”不允许获取空值。//请考虑更新其可空性注释。 record MyPoco(string Name);

同样,此设置在反序列化时添加了强制执行:

JsonSerializerOptions options = new() { RespectNullableAnnotations = true };
string json = """{"Name":null}""";
JsonSerializer.Deserialize<MyPoco>(json, options);
// System.Text.Json.JsonException:类型“MyPoco”上的构造函数参数“Name”不允许为空值。//请考虑更新其可空性注释。

限制

由于非空引用类型的实现方式,此功能带有一些重要的限制,用户在启用之前需要熟悉这些限制。问题的根源在于引用类型可空性在 IL 中没有一流的表示形式,例如从运行时反射的角度来看,表达式 MyPoco 和 MyPoco? 是无法区分的。虽然编译器会尽可能通过发出属性元数据来弥补这一点,但这仅限于特定类型定义范围内的非泛型成员注解。正是出于这个原因,该标志仅验证非泛型属性、字段和构造函数参数上存在的可空性注释。System.Text.Json 不支持对

顶级类型,也就是进行第一次 JsonSerializer.(De)serialize 调用时传递的类型。

集合元素类型,也就是我们无法区分 List和 List类型。

任何通用的属性、字段或构造函数参数。

如果您希望在这些情况下强制执行可空性验证,建议您将类型建模为 struct(因为结构体不允许空值),或者编写一个自定义转换器,将其 HandleNull 属性重写为 true。

功能开关

用户可以使用 System.Text.Json.Serialization.RespectNullableAnnotationsDefault 功能开关全局打开 RespectNullableAnnotations 设置,该开关可通过项目配置进行设置:

<ItemGroup><RuntimeHostConfigurationOption Include="System.Text.Json.Serialization.RespectNullableAnnotationsDefault" Value="true" />
</ItemGroup>

可空参数和可选参数之间的关系

需要注意的是,RespectNullableAnnotations 不会将强制执行范围扩展到未指定的 JSON 值:

JsonSerializerOptions options = new() { RespectNullableAnnotations = true };
var result = JsonSerializer.Deserialize<MyPoco>("{}", options); // No exception!
Console.WriteLine(result.Name is null); // True
class MyPoco
{public string Name { get; set; }
}

这是因为 STJ 将必需属性和非可空属性视为正交概念。这源于 C# 语言本身,在 C# 语言中,您可以拥有可空的 required 属性:

MyPoco poco = new() { Value = null }; // 没有编译器警告
class MyPoco
{public required string? Value { get; set; }
}

以及不可为空的可选属性:

class MyPoco
{public string Value { get; set; } = "default";
}

同样的正交性也适用于构造函数参数:

record MyPoco(string RequiredNonNullable,string? RequiredNullable,string OptionalNonNullable = "default",string? OptionalNullable = "default");

遵循非可选的构造函数参数

基于 STJ 构造函数的反序列化历来将所有构造函数参数视为可选,如以下示例中所示:

var result = JsonSerializer.Deserialize<Person>("{}");
Console.WriteLine(result); // Person { Name = , Age = 0 }
record Person(string Name, int Age);

在 .NET 9 中,我们包含了 RespectRequiredConstructorParameters 标志,该标志会改变行为,使得非可选的构造函数参数现在被视为必需的:

JsonSerializerOptions options = new() { RespectRequiredConstructorParameters = true };
string json = """{"Optional": "value"}""";
JsonSerializer.Deserialize<MyPoco>(json, options);
record MyPoco(string Required, string? Optional = null);
// JsonException:类型“MyPoco”的 JSON 反序列化缺少必需的属性,包括:“Required”。

功能开关

用户可以使用 System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault 功能开关全局打开 RespectRequiredConstructorParameters 设置,该开关可通过项目配置进行设置:

<ItemGroup><RuntimeHostConfigurationOption Include="System.Text.Json.Serialization.RespectRequiredConstructorParametersDefault" Value="true" />
</ItemGroup>

RespectNullableAnnotations 和 RespectRequiredConstructorParameter 属性均作为可选标记实现,以避免破坏现有应用程序。如果您正在编写新应用程序,强烈建议您在代码中启用这两个标记。

自定义枚举成员名称

新的 JsonStringEnumMemberName 特性可以用来为作为字符串序列化的类型中的单个枚举成员自定义名称:

JsonSerializer.Serialize(MyEnum.Value1 | MyEnum.Value2); // "Value1, Custom enum value"
[Flags, JsonConverter(typeof(JsonStringEnumConverter))]
enum MyEnum
{Value1 = 1,[JsonStringEnumMemberName("Custom enum value")]Value2 = 2,
}

无序元数据读取

System.Text.Json 的某些功能(例如多态性或 ReferenceHandler.Preserve)需要在数据传输中发出元数据属性:

JsonSerializerOptions options = new() { ReferenceHandler = ReferenceHandler.Preserve };
Base value = new Derived("Name");
JsonSerializer.Serialize(value, options); // {"$id":"1","$type":"derived","Name":"Name"}
[JsonDerivedType(typeof(Derived), "derived")]
record Base;
record Derived(string Name) : Base;

默认情况下,STJ 元数据读取器要求元数据属性 $id 和 $type 必须在 JSON 对象的开始处定义:

JsonSerializer.Deserialize<Base>("""{"Name":"Name","$type":"derived"}""");
// JsonException: The metadata property is either not supported by the
// type or is not the first property in the deserialized JSON object.

众所周知,当需要反序列化不是来自 System.Text.Json 的 JSON 有效负载时,这会产生问题。可以配置新的 AllowOutOfOrderMetadataProperties 来禁用此限制:

JsonSerializerOptions options = new() { AllowOutOfOrderMetadataProperties = true };
JsonSerializer.Deserialize<Base>("""{"Name":"Name","$type":"derived"}""", options); // Success

启用此标志时应小心谨慎,因为在对非常大的 JSON 对象执行流式反序列化时,它可能会导致缓冲过度(和 OOM 故障)。这是因为元数据属性必须在实例化反序列化对象之前读取,这意味着所有位于 $type 属性之前的属性必须保留在缓冲区中,以便后续的属性绑定。

自定义缩进

JsonWriterOptions 和 JsonSerializerOptions 类型现在公开了用于配置缩进的 API。以下示例启用了单制表符缩进:

JsonSerializerOptions options = new()
{WriteIndented = true,IndentCharacter = '\t',IndentSize = 1,
};
JsonSerializer.Serialize(new { Value = 42 }, options);

JsonObject 属性顺序操作

JsonObject 类型是可变 DOM 的一部分,用于表示 JSON 对象。尽管该类型被建模为 IDictionary,但它确实封装了用户不可修改的隐式属性顺序。新版本公开了其他 API,可有效地将该类型建模为有序字典:

public partial class JsonObject : IList<KeyValuePair<string, JsonNode?>>
{public int IndexOf(string key);public void Insert(int index, string key, JsonNode? value);public void RemoveAt(int index);
}

这允许修改可以直接影响属性顺序的对象实例:

// 将 $id 属性添加或移动到对象的开头
var schema = (JsonObject)JsonSerializerOptions.Default.GetJsonSchemaAsNode(typeof(MyPoco));
switch (schema.IndexOf("$id", out JsonNode? idValue))
{case < 0: // 缺少 $id 属性idValue = (JsonNode)"https://example.com/schema";schema.Insert(0, "$id", idValue);break;case 0: // $id 属性已位于对象的开头break; case int index: //$id 存在但不在对象的开头schema.RemoveAt(index);schema.Insert(0, "$id", idValue);
}

JsonElement 和 JsonNode 中的 DeepEquals 方法

新的 JsonElement.DeepEquals 方法扩展了对 JsonElement 实例的深度相等比较,补充了已有的 JsonNode.DeepEquals 方法。此外,这两个方法在其实现中进行了改进,例如处理等效 JSON 数字表示的方式:

JsonElement left = JsonDocument.Parse("10e-3").RootElement;
JsonElement right = JsonDocument.Parse("0.001").RootElement;
JsonElement.DeepEquals(left, right); // True

JsonSerializerOptions.Web

新的 JsonSerializerOptions.Web 单例可以使用 JsonSerializerDefaults.Web 设置快速序列化值:

JsonSerializerOptions options = JsonSerializerOptions.Web; // 用来代替 new(JsonSerializerDefaults.Web);
JsonSerializer.Serialize(new { Value = 42 }, options); // {"value":42}

性能改进

有关 .NET 9 中 System.Text.Json 性能改进的详细说明,请参阅 Stephen Toub 的“.NET 9 中的性能改进”文章中的相关部分。

结束语

.NET 9 拥有大量新功能和使用质量改进,重点是 JSON 架构和智能应用程序支持。在 .NET 9 开发期间,共有 46 个拉取请求为 System.Text.Json 做出贡献。我们希望您尝试新功能并向我们提供反馈,告诉我们它如何改进您的应用程序,以及您可能遇到的任何可用性问题或错误。

我们随时欢迎社区贡献。如果您想为 System.Text.Json 做出贡献,请查看我们在 GitHub 上的求助问题列表。

相关文章:

技术速递|.NET 9 中 System.Text.Json 的新增功能

作者&#xff1a;Eirik Tsarpalis - 首席软件工程师 排版&#xff1a;Alan Wang System.Text.Json 的9.0 版本包含许多功能&#xff0c;主要侧重于 JSON 架构和智能应用程序支持。它还包括一些备受期待的增强功能&#xff0c;例如可空引用类型支持、自定义枚举成员名称、无序元…...

LLM 使用 Elastic 实现可观察性:Azure OpenAI (二)

作者&#xff1a;来自 Elastic Muthukumar Paramasivam•Lalit Satapathy 我们为 Azure OpenAI GA 包添加了更多功能&#xff0c;现在提供提示和响应监控、PTU 部署性能跟踪和计费洞察&#xff01; 我们最近宣布了 Azure OpenAI 集成的 GA。你可以在我们之前的博客 LLM 可观察性…...

数据库基础(2) . 安装MySQL

0.增加右键菜单选项 添加 管理员cmd 到鼠标右键 运行 reg文件 在注册表中添加信息 这样在右键菜单中就有以管理员身份打开命令行的选项了 1.获取安装程序 网址: https://dev.mysql.com/downloads/mysql/ 到官网下载MySQL8 的zip包, 然后解压 下载后的包为: mysql-8.0.16-…...

高效自动化测试,引领汽车座舱新纪元——实车篇

引言 作为智能网联汽车的核心组成部分&#xff0c;智能座舱不仅是驾驶者与车辆互动的桥梁&#xff0c;更是个性化、智能化体验的源泉。实车测试作为验证智能座舱功能实现、用户体验、行车安全及法规符合性的关键环节&#xff0c;能够最直接地模拟真实驾驶场景&#xff0c;确保…...

GitHub中搜索项目方法

0 Preface/Foreword 1 搜索方法 1.1 项目介绍 如上截图&#xff0c;一个项目包含的基本信息&#xff1a; 项目名项目简介项目介绍Watch数量&#xff0c;接收邮件提醒Star数量&#xff0c;关注&#xff0c;subscribeFork数量&#xff0c;在repo中创建分支 1.2 限定项目名查找…...

浅谈串口服务器的作用

串口服务器是一种网络设备&#xff0c;它允许通过TCP/IP网络远程访问串行设备。它的作用主要包括&#xff1a; 1、远程访问&#xff1a;通过将串行通信转换为以太网通信&#xff0c;串口服务器使得远程访问串行设备成为可能&#xff0c;这对于远程监控和控制非常有用。 2、数据…...

Spark 的Standalone集群环境安装与测试

目录 一、Standalone 集群环境安装 &#xff08;一&#xff09;理解 Standalone 集群架构 &#xff08;二&#xff09;Standalone 集群部署 二、打开监控界面 &#xff08;一&#xff09;master监控界面 &#xff08;二&#xff09;日志服务监控界面 三、集群的测试 &a…...

在Java中,实现数据库连接通常使用JDBC

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…...

Git 测验

Git 测验 引言 Git 是一款强大的分布式版本控制系统,它由Linus Torvalds创建,主要用于帮助多人协作开发项目。Git 的设计目标是速度、数据完整性以及分布式支持。自从2005年发布以来,Git 已经成为全球最流行的版本控制系统之一,被广泛应用于各种规模的软件开发项目中。 …...

L1G3000 提示工程(Prompt Engineering)

什么是Prompt(提示词)? Prompt是一种灵活、多样化的输入方式&#xff0c;可以用于指导大语言模型生成各种类型的内容。什么是提示工程? 提示工程是一种通过设计和调整输入(Prompts)来改善模型性能或控制其输出结果的技术。 六大基本原则: 指令要清晰提供参考内容复杂的任务拆…...

【SQL50】day 1

目录 1.可回收且低脂的产品 2.寻找用户推荐人 3.使用唯一标识码替换员工ID 4.产品销售分析 I 5.有趣的电影 6.平均售价 7.每位教师所教授的科目种类的数量 8.平均售价 1.可回收且低脂的产品 # Write your MySQL query statement below select product_id from Products w…...

jmeter脚本-请求体设置变量and请求体太长的处理

目录 1、查询接口 1.1 准备组织列表的TXT文件&#xff0c;如下&#xff1a; 1.2 添加 CSV数据文件设置 &#xff0c;如下&#xff1a; 1.3 接口请求体设置变量&#xff0c;如下&#xff1a; 2、创建接口 2.1 见1.1 2.2 见1.2 2.3 准备创建接口的请求体TXT文件&#xff…...

基于java+SpringBoot+Vue的旅游管理系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…...

SD3模型的部署(本地部署)

文章目录 模型权重的下载需要注意的地方推理代码生成的效果图 模型的结构图 模型权重的下载 SD3&#xff1a;huggingface的权重 我们需要把huggingfaceface下的这些文件都下载到一个文件加下&#xff0c;然后在后面的pipe StableDiffusion3Pipeline.from_pretrained(“stabil…...

讲解DFD和ERD

DFD、ERD 1. DFD&#xff08;数据流图&#xff0c;Data Flow Diagram&#xff09;DFD的主要元素&#xff1a;DFD的层次结构&#xff1a;举例&#xff1a;1. 上下文图&#xff1a;2. 分解图&#xff1a; DFD的应用&#xff1a; 2. ERD&#xff08;实体关系图&#xff0c;Entity …...

TVM计算图分割--LayerGroup

文章目录 介绍Layergroup调研TVM中的LayergroupTVM Layergroup进一步优化MergeCompilerRegions处理菱形结构TVM中基于Pattern得到的子图TPUMLIR地平线的Layergroup介绍 Layergroup目前没找到严格、明确的定义,因为不同厂家的框架考虑的因素不同,但是基本逻辑是差不多的。一般…...

OPPO开源Diffusion多语言适配器—— MultilingualSD3-adapter 和 ChineseFLUX.1-adapter

MultilingualSD3-adapter 是为 SD3 量身定制的多语言适配器。 它源自 ECCV 2024 的一篇题为 PEA-Diffusion 的论文。ChineseFLUX.1-adapter是为Flux.1系列机型量身定制的多语言适配器&#xff0c;理论上继承了ByT5&#xff0c;可支持100多种语言&#xff0c;但在中文方面做了额…...

Spring 设计模式之责任链模式

Spring 设计模式之责任链模式 责任链模式用到的场景java举例 责任链模式 责任链模式&#xff08;Chain of Responsibility&#xff09;是一种行为设计模式&#xff0c;它允许你将请求沿着处理者链进行传递。 每个处理者可以对请求进行处理&#xff0c;也可以将请求传递给链中的…...

简单的 docker 部署ELK

简单的 docker 部署ELK 这是我的运维同事部署ELK的文档&#xff0c;我这里记录转载一下 服务规划 架构: Filebeat->kafka->logstash->ES kafka集群部署参照: kafka集群部署 部署服务程序路径/数据目录端口配置文件elasticsearch/data/elasticsearch9200/data/elas…...

四款主流的3D创作和游戏开发软件的核心特点和关系

四款主流的3D创作和游戏开发软件的核心特点和关系 3D建模软件&#xff1a; Blender&#xff1a; 开源免费&#xff0c;功能全面优点&#xff1a; 完全免费持续更新优化社区活跃&#xff0c;学习资源丰富功能全面(建模、动画、渲染等) 缺点&#xff1a; 学习曲线陡峭界面操作…...

别再只盯着人脸了!手把手教你用Python复现2023年最新的多模态情绪识别模型COGMEN

别再只盯着人脸了&#xff01;手把手教你用Python复现2023年最新的多模态情绪识别模型COGMEN 情绪识别技术正在经历从单一模态到多模态融合的范式转变。传统基于面部表情的分析方法往往受限于光照条件、遮挡问题以及文化差异带来的表达偏差。2023年发布的COGMEN模型通过引入图…...

用AI写论文,重复率和AIGC疑似率能同时控制在20%以内吗?实测几款主流软件的结果

2026年的毕业季&#xff0c;学术审核的天&#xff0c;彻底变了。两个月前&#xff0c;我的一位研究生朋友提交了初稿&#xff0c;查重率12%&#xff0c;自己还挺满意。结果导师一句话让他当场emo&#xff1a;“你这AIGC检测率42%&#xff0c;是不是AI代写的&#xff1f;”他愣住…...

深度学习分段逼近实战:激活函数硬件友好型实现指南

1. 项目概述&#xff1a;为什么“分段逼近”不是数学游戏&#xff0c;而是深度学习落地的命脉“Mastering Deep Learning: The Art of Approximating Non-Linearities with Piecewise Estimations Part-2”——这个标题里藏着一个被太多教程刻意绕开的真相&#xff1a;深度学习…...

Agent-S3技术深度解析:首个超越人类性能的GUI智能体架构演进与应用实践

Agent-S3技术深度解析&#xff1a;首个超越人类性能的GUI智能体架构演进与应用实践 【免费下载链接】Agent-S Agent S: an open agentic framework that uses computers like a human 项目地址: https://gitcode.com/GitHub_Trending/ag/Agent-S Agent-S3作为首个在OSWo…...

windows下vs 2015 libtorrent库的配置,vs2015下-boost-openssl-libtorrent的配置

libtorrent依赖OpenSSL和boost库&#xff0c;首先要编译Openssl和boost库。 1、安装ActivePerl&#xff0c;下载地址&#xff1a;网上找。 安装完后配置环境变量(一般安装成功后&#xff0c;环境变量就已经配置好了&#xff0c;如果没有配置自己配置环境变量)&#xff1a; …...

轨迹在线识别导向的3D折线焊缝机器人摆动GMAW实时跟踪系统【附程序】

✨ 长期致力于3D折线焊缝、机器人、GMAW、轨迹在线识别、焊缝跟踪研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基于激光位移传感与密度聚类点云在线…...

ESP32音频录制系统:构建智能声音采集的完整解决方案

ESP32音频录制系统&#xff1a;构建智能声音采集的完整解决方案 【免费下载链接】esp32_SoundRecorder ESP32 Sound recorder with simple code in arduino-esp32. (I2S interface) 项目地址: https://gitcode.com/gh_mirrors/es/esp32_SoundRecorder 在物联网和嵌入式系…...

如何快速完成AI智能图像分层:layerdivider完整使用指南

如何快速完成AI智能图像分层&#xff1a;layerdivider完整使用指南 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经面对复杂的插画设计&#x…...

TV Bro电视浏览器:彻底解决Android电视上网难题的完美方案

TV Bro电视浏览器&#xff1a;彻底解决Android电视上网难题的完美方案 【免费下载链接】tv-bro Simple web browser for android optimized to use with TV remote 项目地址: https://gitcode.com/gh_mirrors/tv/tv-bro 你是否曾经尝试在智能电视上浏览网页&#xff0c;…...

React上下文菜单常见问题解答:解决10个典型使用难题

React上下文菜单常见问题解答&#xff1a;解决10个典型使用难题 【免费下载链接】react-contextmenu Project is no longer maintained 项目地址: https://gitcode.com/gh_mirrors/re/react-contextmenu React-contextmenu 是一个强大的 React 上下文菜单组件库&#xf…...