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

深入解析:Unity:XML笔记(二)——Xml序列化、反序列化、IXmlSerializable接口

写在前面:

写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。

三、Xml序列化

序列化就是把想要存储的内容转换为字节序列用于存储或传递。

1、序列化

我们先创建一个类,之后利用Xml序列化来存储这个类:

public class Test
{
public int testPublic = 10;
private int testPrivate = 11;
protected int testProtected = 12;
internal int testInternal = 13;
public string testPublicStr = "123";
public int testPro { get; set; }
public Test2 testClass = new Test2();
public int[] arrayInt = new int[3] { 5, 6, 7 };
public List listInt = new List() { 1, 2, 3, 4 };
public List listItem = new List() { new Test2(), new Test2() };
}
public class Test2
{
public int test1 = 1;
public float test2 = 1.1f;
public bool test3 = true;
}

Xml序列化的第一步是确认存储路径:string path = Application.persistentDataPath + "/Test.xml";该存储路径设置方式和之前使用XmlDocument存储的方式一样。

序列化存储需要在一个using代码块中,如下:

using (StreamWriter stream = new StreamWriter(path)){          }

现在对这行代码进行解释。StreamWriter是向文件流写入字符的类,属于System.IO命名空间。括号内的代码的意思是:写入一个文件流,如果有该文件,直接打开并修改;如果没有该文件,自动释放掉。new StreamWriter()
这里还涉及到using 的新用法:括号内包裹的声明的对象,会在大括号语句块结束后自动释放掉。当语句块结束时会自动调用对象的Dispose方法,让其销毁。using一般是配合 内存占用比较大或者有读写操作时进行使用。

在语句块中,我们需要创建一个“序列化机器”来将我们的类序列化:

 XmlSerializer s = new XmlSerializer(typeof(Test));

需要注意的是,序列化机器的类型,一定是要和我们需要序列化存储的对象是同样的类型。接下来就可以使用序列化机器进行序列化:

s.Serialize(stream, lt);

这句代码通过序列化机器,对我们类对象进行翻译,将其翻译成xml文件写入到对应文件中。第一个参数:文件流对象;第二个参数:想要被翻译的对象。这样,就完成了序列化存储:

public class lession1 : MonoBehaviour
{
void Start()
{
Test lt = new Test();
string path = Application.persistentDataPath + "/Test.xml";
using (StreamWriter stream = new StreamWriter(path))
{
XmlSerializer s = new XmlSerializer(typeof(Test));
s.Serialize(stream, lt);
}
}
}

我们可以在我们设置的保存路径中,找到序列化后的Xml文件:

10
123
1
1.1
true
5
6
7
1
2
3
4
1
1.1
true
1
1.1
true
0

可以看到,我们类中private、protected、internal修饰的变量都没有被序列化。也就是说,Xml序列化方法只能序列化公共成员。此外,不支持字典序列化,如果类中有字典,就会报错。

2、修改节点信息或设置属性信息

可以通过特性修改节点信息或者设置属性信息。例如,如果需要将Test2类中的成员以属性方式存储,可以加上特性:[XmlAttribute()],如果想修改属性的名字,可以在括号内传入想要的属性名:[XmlAttribute("Test1")。

public class Test2
{
[XmlAttribute("Test1")]
public int test1 = 1;
[XmlAttribute()]
public float test2 = 1.1f;
[XmlAttribute()]
public bool test3 = true;
}

如果想要修改变量的名字,可以加上特性:[XmlElement("testPublic111")],括号内传入属性名:

[XmlElement("testPublic111")]
public int testPublic = 10;

如果想要修改数组的名字,可以添加特性:[XmlArray("IntList")],如果想要修改数组中元素节点的名字,可以用特性:[XmlArrayItem("Int32")]

[XmlArray("IntList")]
[XmlArrayItem("Int32")]
public int[] arrayInt = new int[3] { 5, 6, 7 };

四、Xml反序列化

反序列化就是把存储或收到的字节序列信息解析读取出来使用。

1、判断文件是否存在

在反序列化之前,需要判断文件是否存在。判断方式是:File.Exists(path),括号中传入的是文件地址。

void Start()
{
string path = Application.persistentDataPath + "/Test.xml";
if(File.Exists(path))
{
}
}

2、反序列化

反序列化和序列化基本相同,区别就是这里使用的是StreamReader,从流中读出字符的类。如下:using (StreamReader reader = new StreamReader(path)){  }

同样的,在using语句块中,初始化一个反序列化翻译机器: XmlSerializer s = new XmlSerializer(typeof(Test));

然后调用s.Deserialize(reader)方法即可完成反序列化:

void Start()
{
string path = Application.persistentDataPath + "/Test.xml";
if(File.Exists(path))
{
using (StreamReader reader = new StreamReader(path))
{
XmlSerializer s = new XmlSerializer(typeof(Test));
Test lt = s.Deserialize(reader) as Test;
}
}
}

这里需要注意的是,在三中定义Test类时,为了方便,很多值都是直接在类中初始化的。对于List对象,如果有默认值,反序列化时不会清空而是会往后继续添加,所以最好不要在类中直接初始化。

五、IXmlSerializable接口

C#的的XmlSerializer提供了可扩展内容,可以让一些不能被序列化和反序列化的特殊类能被处理,例如字典。让特殊类继承 IXmlSerializable接口实现其中的方法即可。

1、自定义序列化和反序列化

先按三、四所学知识创建一个类并书写序列化和反序列化方法:

public class Test3
{
public int test1;
public string test2;
}
public class lession3 : MonoBehaviour
{
void Start()
{
Test3 t = new Test3();
string path = Application.persistentDataPath + "/Test3.xml";
using (StreamWriter writer = new StreamWriter(path))
{
XmlSerializer s = new XmlSerializer(typeof(Test3));
s.Serialize(writer, t);
}
using(StreamReader reader = new StreamReader(path))
{
XmlSerializer s = new XmlSerializer(typeof(Test3));
Test3 t2 = s.Deserialize(reader) as Test3;
}
}
}

这段代码实现了对类Test3进行序列化和反序列化。这里补充一点,在序列化时 如果对象中的引用成员为空 那么xml里面是看不到该字段的,所以这里的xml文件中没有string。

接下来,我们就可以开始自定义序列化方法和反序列化方法。首先需要类Test3继承IXmlSerializable接口,并在Test3中重写接口中的函数:

其中public XmlSchema GetSchema()暂时不需要了解,该函数返回结构,直接return null即可。public void ReadXml(XmlReader reader)是反序列化会调用的方法,在其中书写的代码能够替换掉该类原来的反序列化函数。public void WriteXml(XmlWriter writer)是序列化会调用的方法。这两个函数可以定义序列化的规则。

public class Test3:IXmlSerializable
{
public int test1;
public string test2;
//返回结构
public XmlSchema GetSchema()
{
return null;
}
//反序列化时会自动调用方法
public void ReadXml(XmlReader reader)
{
}
//序列化时会自动调用的方法
public void WriteXml(XmlWriter writer)
{
}
}

(1)自定义读属性和写属性

首先来自定义读属性和写属性的规则。如果要自定义序列化的规则,一定会用到XmlWriter、XmlReader中的一些方法。

对于写属性,XmlWriter是写入器对象提供一系列方法来生成和写入 XML 格式的数据。可以使用:writer.WriteAttributeString()写入属性,括号内传入的第一个参数是属性名,第二个参数是属性的内容。

对于读属性,XmlReader则是用于读入数据的工具类。可以通过reader["test1"]来获得[]内属性的值。如下所示:

public void ReadXml(XmlReader reader)
{
this.test1 = int.Parse(reader["test1"]);
this.test2 = reader["test2"];
}
public void WriteXml(XmlWriter writer)
{
writer.WriteAttributeString("test1", this.test1.ToString());
writer.WriteAttributeString("test2", this.test2)
}

(2)自定义读节点和写节点

①方式1

写节点可以通过XmlWriter的方法:writer.WriteElementString(),括号内分别传入节点名、节点的数值即可。

读节点需要用reader.Read(),表示逐步读。一开始Reader位于根节点Test3,调用reader.Read()后读到test1节点,继续调用reader.Read()后读到test1节点包裹的内容,此时就可以将该值读出来。继续调用reader.Read()后读到尾部包裹节点,再调用reader.Read()读到test2节点...以此类推。

  这里为了方便看所以给test2赋值为了123再进行读写数据。

public void ReadXml(XmlReader reader)
{
reader.Read();//这时是读到的test1节点
reader.Read();//这时是读到的test1节点包裹的内容
this.test1 = int.Parse(reader.Value);
reader.Read();//尾部包裹节点
reader.Read();//这时读到的是test2节点
reader.Read();//读到的是test2节点包裹的内容
this.test2 = reader.Value;
}
public void WriteXml(XmlWriter writer)
{
writer.WriteElementString("test1", this.test1.ToString());
writer.WriteElementString("test2", this.test2);
}
②方式2

方式①读节点的重复代码太多了,可以采用方式2这种写法:

while(reader.Read())
{
if(reader.NodeType == XmlNodeType.Element)
{
switch(reader.Name)
{
case "test1":
reader.Read();
this. test1 = int.Parse(reader.Value);
break;
case "tese2":
reader.Read();
this.test2 = reader.Value;
break;
}
}
}

(3)自定义读写包裹节点

如果想自定义写包裹节点,类似于下图,test1中包裹着节点int,test2中包裹着节点string

①写

以第一个写int为例。需要先声明一个序列化器

XmlSerializer s = new XmlSerializer(typeof(int));

然后使用节点相关API:这两句代码表示开始节点test1,结束节点test1,在这两行中间定义的节点就会被包裹在节点test1中间。

writer.WriteStartElement("test1");
writer.WriteEndElement();

例如,在以上两句代码中间使用序列化器写入节点teat的值,序列化器是int类型的,所以会生成<int>0</int>节点:

writer.WriteStartElement("test1");
s.Serialize(writer, test1);
writer.WriteEndElement();
②读

同样以读int为例,首先需要创建一个序列化器:

XmlSerializer s = new XmlSerializer(typeof(int));

调用reader.Read()让reader指向test1:

reader.Read();

然后可以使用以下两句代码,表示读test1节点的开始于结束:

reader.ReadStartElement("test1");
reader.ReadEndElement();

最后在中间写需要读入的数据即可:

reader.ReadStartElement("test1");
test1 = (int)s.Deserialize(reader);
reader.ReadEndElement();

完整代码:

public void ReadXml(XmlReader reader)
{
XmlSerializer s = new XmlSerializer(typeof(int));
reader.Read();
reader.ReadStartElement("test1");
test1 = (int)s.Deserialize(reader);
reader.ReadEndElement();
XmlSerializer s2 = new XmlSerializer(typeof(string));
reader.ReadStartElement("test2");
test2 = (string)s2.Deserialize(reader);
reader.ReadEndElement();
}
public void WriteXml(XmlWriter writer)
{
XmlSerializer s = new XmlSerializer(typeof(int));
writer.WriteStartElement("test1");
s.Serialize(writer, test1);
writer.WriteEndElement();
XmlSerializer s2 = new XmlSerializer(typeof(string));
writer.WriteStartElement("test2");
s2.Serialize(writer, test2);
writer.WriteEndElement();
}

2、让Dictionary支持序列化反序列化

相当于以上知识的一个小应用,可以拓展一个可以被序列化和反序列化的字典类,所以不多解释:

public class SerializerDictionary : Dictionary, IXmlSerializable
{
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
XmlSerializer keySer = new XmlSerializer(typeof(TKey));
XmlSerializer ValueSer = new XmlSerializer(typeof(TValue));
reader.Read();
while(reader.NodeType != XmlNodeType.EndElement)
{
TKey key = (TKey)keySer.Deserialize(reader);
TValue value = (TValue)ValueSer.Deserialize(reader);
this.Add(key, value);
}
reader.Read();
}
public void WriteXml(XmlWriter writer)
{
XmlSerializer keySer = new XmlSerializer(typeof(TKey));
XmlSerializer ValueSer = new XmlSerializer(typeof(TValue));
foreach(KeyValuePair kv in this)
{
keySer.Serialize(writer, kv.Key);
ValueSer.Serialize(writer, kv.Value);
}
}
}

相关文章:

深入解析:Unity:XML笔记(二)——Xml序列化、反序列化、IXmlSerializable接口

深入解析:Unity:XML笔记(二)——Xml序列化、反序列化、IXmlSerializable接口pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…...

2025.9.15——知识点学习

图 回路 起点和终点相同的路径,也叫“环” 重边 两个顶点中间不只有一条边 自环 自己到自己的边 简单图 没有重边和自环的图 完全图 每对定点之间都恰有一条边相连 稠密图 边数接近完全图,e>=NlogN 稀疏图 边数远少于完全图,e<NlogN...

详细介绍:拉帮结派下的制造麻烦

详细介绍:拉帮结派下的制造麻烦pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...

C# Avalonia 13- MoreDrawing - CustomPixelShader

C# Avalonia 13- MoreDrawing - CustomPixelShader目前Avalonia无法继承Effect类重写,因为构造函数是internal。我们重写一个GrayscaleImage实现灰化。GrayscaleImage类public class GrayscaleImage : Control{public static readonly StyledProperty<IImage?> SourceP…...

使用标签Tag控制蒙太奇的触发时机-playmontageAndWait-Send GameplayEvent-WaitGameplayEvent

控制蒙太奇的通知,可以在蒙太奇中的通知中发送标签事件,在GA中接收标签事件 在事件通知蓝图中...

sql事务执行

使用上下文管理器from sqlalchemy import create_engine, text from sqlalchemy.orm import sessionmaker from contextlib import contextmanager import logging# 创建数据库连接 engine = create_engine(mysql+pymysql://username:password@localhost/dbname) SessionLocal …...

GAS_Aura-Spawn FireBolt from Event

1将Spawn火球设置为单独的接口,并在触发GA时触发...

在CentOS 7系统上创建SSL/TLS证书以启用HTTPS

第一步:装备准备 首先,确保您的武器库(包管理器)是最新的。咒语(命令)如下: sudo yum update sudo yum install epel-release sudo yum install mod_ssl 这将更新您的包索引,安装EPEL仓库,并让Apache HTTP服务器拥有处理SSL的能力。 第二步:私钥的锻造 SSL/TLS证书需…...

从Craigslist广告到BHIS安全顾问:非科班生的渗透测试求职之路

本文讲述作者通过Craigslist招聘广告应聘Black Hills信息安全公司的经历,涉及文本简历防钓鱼技巧、Linux技术面试、网络端口知识考察以及问题解决能力的实际测试,展现了网络安全行业独特的招聘方式与技术评估要点。ADVISORY: 本博文中提及的技术和工具可能已过时,不适用于当…...

Java 微服务架构中的实践与挑战

一、引言 微服务架构已成为现代分布式系统的主流设计思想。它强调将单体应用拆分为一组小而自治的服务,每个服务聚焦特定业务能力,并通过轻量级通信方式协作。对于以 Java 为核心的企业级系统,微服务架构的落地往往依赖 Spring Boot、Spring Cloud 以及后续兴起的服务网格(…...

Java 与大数据处理:从 Hadoop 到实时计算

一、引言 在大数据时代,数据已经成为企业的战略资产。无论是金融风控、智能推荐,还是智慧城市与医疗健康,背后都依赖海量数据的存储与计算。作为企业开发的主流语言,Java 在大数据生态中扮演着不可替代的角色。从最早的 Hadoop 批处理框架,到 Spark、Flink 的内存与流式计…...

国产IT运维卡壳?乐维智能运维体让运维团队告别“适配难、监控乱”

“刚把3台核心服务器操作系统从CentOS7换成麒麟V10,之前用的Zabbix探针直接无法采集服务器的CPU、磁盘温度;机房中华为交换机、锐捷AC、浪潮存储分散在不同机柜,每台设备都要单独登录后台看告警,上周就因为没有及时发现交换机端口故障,导致研发部门断网整整一天……” 某1…...

ubuntu18安装mysql5.7

环境Os:ubuntu 18.04 desktop桌面版mysql:mysql-5.7.42-linux-glibc2.12 查看操作系统信息root@db:/soft# uname -a Linux db 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linuxroot@db:/soft# cat /etc/os-release NAME="U…...

【IEEE出版 |已连续5届EI稳定检索】第六届计算机工程与智能控制学术会议(ICCEIC 2025)

聚焦计算机工程与智能控制前沿,涵盖网络安全、硬件系统、软件工程、嵌入式创新等多个核心议题及交叉学科研究。ICCEIC 2025将计算机工程和智能控制领域的创新学者和工业专家聚集到一个共同的论坛上,共享最新科研成果,破解关键问题,展望未来发展。第六届计算机工程与智能控制…...

在选择2025年代码托管平台时,Gitee和GitHub作为国内外两大主流平台各有优势。本文将从多个维度进行对比分析,帮助开发者做出更适合自身需求的选择。

在选择2025年代码托管平台时,Gitee和GitHub作为国内外两大主流平台各有优势。本文将从多个维度进行对比分析,帮助开发者做出更适合自身需求的选择。 作为中国本土领先的代码托管平台,Gitee近年来发展迅猛。数据显示,平台已拥有超过500万注册用户和1000万活跃仓库,在国内开…...

android使用socks5的教程

1.安装APP 下载地址忽略 2.使用配置的地址账号信息 少侠,我看你气度不凡天赋异禀,骨骼精奇,这么帅,来了就帮推荐一把吧 我的最近更新 最新发布文章、框架、咨询等,来看看吧...

vue3 自定义指令并实现页面元素平滑上升

基本示例 // 在directives/example.ts中 import type { Directive } from "vue"; /*** 示例*/ const example: Directive = {mounted(el) {console.log("mounted", el);},beforeUnmount(el) {console.log("beforeUnmount", el);} }; export defa…...

abp记录

abp记录abp8.3 : abp new MyCompany.MyProject -t app --no-ui -d ef --database-provider mysql --version 8.3.0...

强化学习(二十):模仿学习

一、概念 1、很多情况下,环境没有明确的奖励,例如聊天,自动驾驶的操作,无法明确定义好坏 2、不知道该怎么定义奖励时,可以收集专家示范 3、模仿学习(imitation learning,IL):智能体通过专家示范来学习,环境没有奖励给智能体二、行为克隆 1、类似于监督学习,专家做什…...

重生之从零开始的神经网络算法学习之路 —— 第七篇 重拾 PyTorch(超分辨率重建和脚本的使用)

重生之从零开始的神经网络算法学习之路 —— 第七篇 重拾 PyTorch(超分辨率重建和脚本的使用)重生之从零开始的神经网络算法学习之路——第七篇 重拾PyTorch(超分辨率重建和脚本的使用) 引言 在前一篇中,我们初步探索了PyTorch框架的使用并体验了GPU加速计算的优势。本篇将…...

从基础到实践(四十五):车载显示屏LCD、OLED、Mini-LED、MicroLED的工作原理、设计差异等说明 - 教程

从基础到实践(四十五):车载显示屏LCD、OLED、Mini-LED、MicroLED的工作原理、设计差异等说明 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…...

国产项目管理工具崛起:Gitee如何以本土化优势重构开发协作生态

国产项目管理工具崛起:Gitee如何以本土化优势重构开发协作生态 在数字化浪潮席卷全球的当下,项目管理工具已成为企业技术栈中不可或缺的基础设施。随着中国科技产业的蓬勃发展,本土化项目管理平台正展现出强大的竞争力。作为国内领先的DevOps全生命周期解决方案提供商,Gite…...

GAS_Aura-Sending Gameplay Events

1讲了增加一个TaskNotify的通知蓝图,及其内部的函数的作用...

【IEEE-智造领空天,寰宇链未来】第五届机电一体化技术与航空航天工程国际学术会议(ICMTAE 2025)

会议将围绕“航空航天工程”、“机电一体化”、“先进制造”、“精密测量与仪器”、“结构强度与完整性”等相关最新研究领域,为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一个分享专业经验,扩大专业网络,面对面交流新思想以及展示研究成…...

进程间通信(消息队列)

消息队列概念 Linux系统中消息队列(Message Queue)是进程间通信的一种方式,这种通信机制的好处是可以传输指定类型(用户可以自行定义)的数据,相同类型的数据根据到达顺序在队列中进行排队。 当然,不同类型的数据不能处于同一个队列中,也就是说系统中可能存在多个消息队列…...

有点长所以单发的闲话(对acgn的看法(存疑))

因为某个东西的影响,突然有些感悟,想写点东西。 先解释题目吧,\(a,c,g,n\) 分别是动画,漫画,游戏,小说。算是构成了所谓“二次元”。 逢 我了解二次元这一块可以说是比较健康且古早的。我看电脑是从 \(3,4\) 岁开始的(我妈如是说),当时是小学吧,我在腾讯(应该是)看…...

【光照】Unity中的[光照模型]概念辨析

本文介绍了游戏渲染中的核心光照模型。传统标准光照模型(Phong/Blinn-Phong)包含漫反射和环境光,计算简单但真实感不足。物理基础渲染(PBR)基于BRDF数学框架,整合GGX法线分布和菲涅尔效应,通过金属度/粗糙度参数实现更真实的能量守恒光照效果。相比传统经验模型,PBR计算…...

深入解析:Shell脚本监控系统资源详解

深入解析:Shell脚本监控系统资源详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important…...

计算几何全家桶

#include <bits/stdc++.h> using namespace std;using point_t=long double; //全局数据类型,可修改为 long long 等constexpr point_t eps=1e-8; constexpr long double PI=3.1415926535897932384l;// 点与向量 template<typename T> struct point {T x,y;bool …...

链表

点击查看代码 /******************************************************************************************************** * * * * * * * Copyright (c) 2023-2024 cececlmx@126.com All right Reserved * ******************************************************…...

国产代码托管平台Gitee崛起:企业数字化转型的安全基石

国产代码托管平台Gitee崛起:企业数字化转型的安全基石 在数字经济高速发展的今天,软件开发已成为企业创新的核心驱动力。作为分布式版本控制系统的Git,因其高效协作特性而广受开发者青睐。然而,随着国际形势变化和数据安全法规日趋严格,越来越多的中国企业开始寻求自主可控…...

Gitee:本土化创新赋能企业数字化转型,打造高效研发新范式

Gitee:本土化创新赋能企业数字化转型,打造高效研发新范式 在数字化转型浪潮席卷各行各业的当下,企业研发效能提升已成为关乎企业核心竞争力的关键因素。作为国内领先的一站式DevOps研发管理平台,Gitee凭借其独特的本土化优势和技术创新实力,正在重新定义企业级代码托管与协…...

完整教程:从无声视频中“听见”声音:用视觉语言模型推理音频描述

完整教程:从无声视频中“听见”声音:用视觉语言模型推理音频描述pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&…...

Win10如何安装语音包

一、系统环境Win10 参考 https://cp.baidu.com/landing/tscp_doc/8e36175e077a04256c1b85e9a0975471二、安装步骤 2.1、控制面板,打开windows设置说明:选择时间和语言选项,看到如下界面,主要关注语言及语音即可2.2、语言安装 选择语言,点击添加语言功能选择泰语,点击一下…...

C#通过TCP/IP控制康奈视读码枪实现方案

一、通信协议解析 康奈视读码枪(如DataMan系列)的TCP/IP通信遵循以下规范:通信模式 服务器模式:读码枪作为TCP服务端监听指定端口(默认23/8000) 客户端模式:PC作为客户端主动连接设备IP指令格式指令类型 示例指令 功能说明触发扫描 TRIGGER ON 启用连续扫描模式读取数据…...

利用三方APP[IP切换助手]使用socks5

1.安装前必读提示 a.此乃三方软件,它有收费模式,你不必理会它首页所出的收费方式.这些都是随机IP,且是不稳定的. b.此乃三方软件,我们不排除他们有可能会收集配置服务器,用户自行决定.之所以推荐它,目的:是为那些不想麻烦自己去注册其他地区apple store id的用户; c.此乃三方软…...

智能卫浴雷达模块感应方案WT4101寿命长不怕干扰

目前新装修的公共卫浴很多都采用的是雷达方案的感应开关方式,采用雷达方案做感应开关的原因很简单,因为雷达在公共环境当中干扰因素少寿命长,能够稳定的承担起感应开关的工作,并且雷达的成本也在逐年下降,让更多雷达感应开关普及到市场上。红外感应模块应用在公共卫浴的痛…...

修改Windows 资源器中文件的创建时间或更新时间

方法一:使用PowerShell 使用管理员身份打开PowerShell 执行语句 更改创建时间(Get-Item "D:\文件\demo.txt").CreationTime = "2025-09-15 12:34:56"更改更新时间(Get-Item "D:\文件\demo.txt").LastWriteTime = "2025-09-15 14:30:00&qu…...

Mysql练习,15个必练语句带你玩转数据库

还在为记不住MySQL语句而苦恼吗?你是否每次写SQL都要反复查阅文档?今天我们就来一起练习MySQL最常用的15个语句,让你从零开始掌握数据库操作。 快速上手MySQL基本操作 连接数据库是第一步,记住用户名和密码要紧跟-u和-p参数,不能有空格。如果不想明文显示密码,可以只输入…...

威力导演2026中文版 CyberLink PowerDirector 2026 v24.0 旗舰版更新内容

讯连科技威力导演(PowerDirector)是一款功能全面的视频编辑软件及视频剪辑软件.威力导演中文版采用独家之智慧型高速不失真影片输出技术SVRT,可快速编辑处理视频,威力导演旗舰版(CyberLink PowerDirector Ultimate)支持XAVC-S及H.265/HEVC音视频编码,威力导演破解版视频创作功能…...

越权漏洞

本实验用本地搭建的pikachu漏洞练习平台做实验水平越权水平越权是指同一权限级别下的不同用户之间,可以非法访问或操作其他用户的数据或资源。即用户通过某种手段,绕过系统的访问控制机制,获取与自身权限同级的其他用户的信息或执行相关操作咱们先看一下水平越权环境可以看到…...

GAS_Aura-Ability Tasks

1讲了PlayMontageAndWait的源码...

本地大模型的崛起:为什么越来越多人不用云端 AI?

一、引言过去两年,AI 产品几乎都依赖云端模型,比如 ChatGPT、文心一言。但现在越来越多人开始尝试 本地大模型(Local LLM):不需要联网、不依赖云端服务器。为什么这种趋势正在兴起?本文从 隐私、安全、成本、效率 等角度来解读。二、什么是“本地大模型”?定义:将大语言…...

Gitee:国产代码托管平台如何重塑企业研发效能版图

Gitee:国产代码托管平台如何重塑企业研发效能版图 在全球数字化转型浪潮中,企业研发效能正成为决定商业竞争力的关键因素。作为中国本土领先的代码托管平台,Gitee通过深度本地化服务与技术创新,正在重新定义企业级软件开发流程。最新统计显示,该平台已汇聚超过1350万开发者…...

CompassBench 大模型评测

OpenCompass 是一个开源开放的大模型评测平台,构建了包含学科、语言、知识、理解、推理五大维度的通用能力评测体系,支持了超过 50 个评测数据集和 30 万道评测题目,支持零样本、小样本及思维链评测。OpenCompass 支持大部分主流 HuggingFaces 上的大语言模型的评测,只需几…...

Windows截图工具Acropalypse漏洞剖析:开发者中心安全的重要教训

本文深入分析Windows Snip and Sketch工具中的Acropalypse漏洞,揭示API设计缺陷导致的安全风险,探讨开发者中心安全原则,并对比Win32与UWP API的安全差异,为安全软件开发提供重要见解。Windows Snip and Sketch中的Acropalypse漏洞,开发者中心安全的教训 Acropalypse是一个…...

bootstrap-flex总结

一主轴方向、默认横线排布 flex-row(默认)。flex-column是竖向排列<div class="d-flex "> <div class="p-2 bg-primary text-white">Item 1</div><div class="p-2 bg-success text-white">Item 2</div><div …...

【源码解读之 Mybatis】【基础篇】-- 第2篇:配置系统深度解析

【源码解读之 Mybatis】【基础篇】-- 第2篇:配置系统深度解析第2篇:配置系统深度解析 1. 配置系统概述 1.0 第1篇思考题解答 在深入学习配置系统之前,让我们先回顾并解答第1篇中提出的思考题,这将帮助我们更好地理解配置系统在整个架构中的作用。 思考题1:为什么 MyBatis …...

eSIM笔记

1. 办理eSIM套餐 -> 获得eSIM套餐的激活码(包含SM-DP+地址,Profile)LPA:1$esim.wo.com.cn$A1B2C3D4 SM-DP+地址:sim.wo.com.cn 激活码:A1B2C3D4 确认码:空 qq:505645074...

拯救者Y7000过热降频解决方法

拯救者Y7000过热降频解决方法 一、型号描述 ​ 型号:拯救者Y7000 2020 ​ CPU:i5-10200H CPU @ 2.4GHz ​ 显卡:NVIDIA GeForce GTX 1650 二、问题描述现象:由于电脑已经使用四年,近期不定时会出现电脑卡顿等现象,但不影响使用就没咋管,经常卡一会,不使用一会就自动恢复…...