当前位置: 首页 > 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; 学习曲线陡峭界面操作…...

聚划算!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测

聚划算&#xff01;Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测 目录 聚划算&#xff01;Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 聚划算&#xff01;Tran…...

信息安全工程师(76)网络安全应急响应技术原理与应用

前言 网络安全应急响应&#xff08;Network Security Incident Response&#xff09;是针对潜在或已发生的网络安全事件而采取的网络安全措施&#xff0c;旨在降低网络安全事件所造成的损失并迅速恢复受影响的系统和服务。 一、网络安全应急响应概述 定义&#xff1a;网络安全应…...

使用 OpenCV 实现图像的透视变换

概述 在计算机视觉领域&#xff0c;经常需要对图像进行各种几何变换&#xff0c;如旋转、缩放和平移等。其中&#xff0c;透视变换&#xff08;Perspective Transformation&#xff09;是一种非常重要的变换方式&#xff0c;它能够模拟三维空间中的视角变化&#xff0c;例如从…...

openGauss数据库-头歌实验1-4 数据库及表的创建

一、创建数据库 &#xff08;一&#xff09;任务描述 本关任务&#xff1a;创建指定数据库。 &#xff08;二&#xff09;相关知识 数据库其实就是可以存放大量数据的仓库&#xff0c;学习数据库我们就从创建一个数据库开始吧。 为了完成本关任务&#xff0c;你需要掌握&a…...

吉利极氪汽车嵌入式面试题及参考答案

inline 的作用 inline 是 C++ 中的一个关键字。它主要用于函数,目的是建议编译器将函数体插入到调用该函数的地方,而不是像普通函数调用那样进行跳转。 从性能角度来看,当一个函数被标记为 inline 后,在编译阶段,编译器可能会将函数的代码直接复制到调用它的位置。这样做…...

pycharm中的服务是什么?

在PyCharm中&#xff0c;服务是指允许在PyCharm中运行的一种功能或插件。服务可以是内置的&#xff0c;也可以是通过插件安装的。 一些常见的PyCharm服务包括&#xff1a; 调试服务&#xff1a;PyCharm提供了全功能的调试工具&#xff0c;可以帮助开发人员通过设置断点、监视变…...

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十七集:制作第二个BOSS燥郁的毛里克

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏第二个BOSS燥郁的毛里克 1.导入素材和制作相关动画1.5处理玩家受到战吼相关行为逻辑处理2.制作相应的行为控制和生命系统管理3.制作战斗场景和战斗…...

深度解析阿里的Sentinel

1、前言 这是《Spring Cloud 进阶》专栏的第五篇文章&#xff0c;这篇文章介绍一下阿里开源的流量防卫兵Sentinel&#xff0c;一款非常优秀的开源项目&#xff0c;经过近10年的双十一的考验&#xff0c;非常成熟的一款产品。 文章目录如下&#xff1a; 2、什么是sentinel&…...

Linux系统-日志轮询(logrotate)

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 这是Linux进阶部分的最后一大章。讲完这一章以后&#xff0c;我们Linux进阶部分讲完以后&#xff0c;我们的Linux操作部分就…...

机器学习在时间序列预测中的应用与实现——以电力负荷预测为例(附代码)

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 随着数据采集技术的发展&#xff0c;时间序列数据在各个领域中的应用越来越广泛。时间序列预测旨在基于过去的时间数据来…...