Unity 数据持久化【PlayerPrefs】

1、数据持久化

在这里插入图片描述

文章目录

  • 1、数据持久化
    • PlayerPrefs基本方法
      • 1、PlayerPrefs概念
      • 2、存储相关
      • 3、读取相关
      • 4、删除数据
      • 思考 信息的存储和读取
    • PlayerPrefs存储位置
      • 1、PlayerPrefs存储的数据在哪个位置
      • 2、PlayerPrefs 数据唯一性
      • 思考 排行榜功能
  • 2、Playerprefs实践
    • 1、必备知识点-反射知识小补充
    • 2、需求分析 Playerprefs数据管理类创建
    • 3、反射存储数据-常用成员、List成员、Dic成员、自定义类成员
    • 4、反射读取数据-常用成员、List成员、Dic成员、自定义类成员
    • 4、加密思路
    • 5、生成资源包

概念

将【变量数据】在内存和硬盘之间的存储或读取

内容

PlayerPrefs的基本方法
PlayerPrefs在不同平台的存储位置
利用反射结合PlayerPrets制作通用存诸工具

PlayerPrefs基本方法

1、PlayerPrefs概念

是unity提供的可以用于存储读取玩家数据的公共类

2、存储相关

PlaverPrefs的数据存储类似于键值对存储一个键对应一个值
提供了存储3种数据的方法int float string
键:string类型
值:int float string对应3API PlayerPrefs.SetInt("myAge", 18);PlayerPrefs.SetFloat("myHeight", 183.5f);PlayerPrefs.SetString("myName", "姓名");PlayerPrefs.Save();bool sex = true; //sex若为true存1,sex若为flase则存1PlayerPrefs.SetInt("sex", sex ? 1 : 0);如果用同一个键名,会进行覆盖PlayerPrefs.SetFloat("myAge", 18.3f);//键名是唯一的

3、读取相关

Set之后也能读取信息,读取顺序为:内存 > 硬盘1intint age = PlayerPrefs.GetInt("myAge");print(age); //0 被覆盖age = PlayerPrefs.GetInt("myAge", 18); //18 设置的初始默认值print(age);2floatfloat height = PlayerPrefs.GetFloat("myHeight", 100f);print(height);3stringstring name = PlayerPrefs.GetString("myName");print(name);是否存在的键名if (PlayerPrefs.HasKey("myName")){print("存在myName对应的键值对数据");}

4、删除数据

删除指定键值对PlayerPrefs.DeleteKey("myAge");删除所有PlayerPrefs.DeleteAll();

思考 信息的存储和读取

玩家信息类,装备信息类
用List存储装备信息
添加标识,存储多个玩家信息
将信息存储读取using System.Collections.Generic;
using UnityEngine;public class Item
{public int id;public int num;
}
public class Player
{public string name;public int age;public int atk;public int def;public List<Item> itemList;//用于存储或读取的标识private string keyName;/// <summary>/// 存储数据/// </summary>public void Save(){PlayerPrefs.SetString(keyName + "_name", name);PlayerPrefs.SetInt(keyName + "_age", age);PlayerPrefs.SetInt(keyName + "_atk", atk);PlayerPrefs.SetInt(keyName + "_def", def);PlayerPrefs.SetInt(keyName + "_ItemNum", itemList.Count);for (int i = 0; i < itemList.Count; i++){PlayerPrefs.SetInt(keyName + "_itemID" + i, itemList[i].id);PlayerPrefs.SetInt(keyName + "_itemNum" + i, itemList[i].num);}PlayerPrefs.Save();}/// <summary>/// 读取数据/// </summary>public void Load(string keyName){//记录传入的标识this.keyName = keyName;name = PlayerPrefs.GetString(keyName + "_name", "未命名");age = PlayerPrefs.GetInt(keyName + "_age", 18);atk = PlayerPrefs.GetInt(keyName + "_atk", 20);def = PlayerPrefs.GetInt(keyName + "_def", 2);//获取数量int num = PlayerPrefs.GetInt(keyName + "_ItemNum", 0);//初始化容器itemList = new List<Item>();Item item;for (int i = 0; i < num; i++){item = new Item();item.id = PlayerPrefs.GetInt(keyName + "_itemID" + i);item.num = PlayerPrefs.GetInt(keyName + "_itemNum" + i);itemList.Add(item);}}
}
public class Test1_Exercises : MonoBehaviour
{void Start(){Player p = new Player();p.Load();//print(p.name);//print(p.age);//print(p.atk);//print(p.def);print("不同类型道具数量:"+p.itemList.Count);for (int i = 0; i < p.itemList.Count; i++){print("道具id:" + p.itemList[i].id);print("道具数量:" + p.itemList[i].num);}Item item = new Item();item.id = 1;item.num = 99;p.itemList.Add(item);item = new Item();item.id = 2;item.num = 99;p.itemList.Add(item);p.Save();//其他玩家Player p2 = new Player();p2.Load("Player2");p2.Save();}
}

PlayerPrefs存储位置

1、PlayerPrefs存储的数据在哪个位置

不同平台存储位置不同

WindowsPlayerPrefs 存储在HKCU\Software\[公司名称]\[产品名称]项下的注册表中其中公司和产品名称是在"Project Settings"中设置的名称运行 regeditHKEY_CURRENT_USERSOFTWAREUnityUnityEditor公司名称产品名称
Android/data/data/应用程序包名/shared_prefs/pkg-name.xml
IOS/Library/Preferences/[应用ID].plist

2、PlayerPrefs 数据唯一性

PlayerPrefs 中不同数据的唯一性
由key决定,不同key决定了不同的数据
同一项目中,如果不同数据key相同,会造成数据丢失

思考 排行榜功能

排行榜主要记录玩家名,玩家得分,玩家通关时间
using System.Collections.Generic;
using UnityEngine;public class RankListInfo
{public List<RankInfo> rankList;public RankListInfo() { Load(); }public void Add(string name, int score, int time){rankList.Add(new RankInfo(name, score, time));}public void Save(){PlayerPrefs.SetInt("rankListNum", rankList.Count);for (int i = 0; i < rankList.Count; i++){RankInfo info = rankList[i];PlayerPrefs.SetString("rankInfo" + i, info.playerName);PlayerPrefs.SetInt("rankInfo" + i, info.playerScore);PlayerPrefs.SetInt("rankInfo" + i, info.playerTime);}}private void Load(){int num = PlayerPrefs.GetInt("rankListNum", 0);rankList = new List<RankInfo>();for (int i = 0;i < num;i++){RankInfo info = new RankInfo(PlayerPrefs.GetString("rankInfo" + i), PlayerPrefs.GetInt("rankScore" + i), PlayerPrefs.GetInt("rankTIme" + i));rankList.Add(info);}}
}public class RankInfo
{public string playerName;public int playerScore;public int playerTime;public RankInfo(string name, int score, int time){playerName = name;playerScore = score;playerTime = time;}
}
public class Test2_Exercises : MonoBehaviour
{void Start(){RankListInfo rankList = new RankListInfo();print(rankList.rankList.Count);for (int i = 0; i < rankList.rankList.Count; i++){print("姓名" + rankList.rankList[i].playerName);print("分数" + rankList.rankList[i].playerScore);print("时间" + rankList.rankList[i].playerTime);}rankList.Add("玩家", 100, 88);rankList.Save();}
}

2、Playerprefs实践

1、必备知识点-反射知识小补充

Type	用于获取类的所有信息:字段、属性、方法 等
Assembly	用于获取程序集,通过程序集获取Type
Activator	用于快速实例化对象using System;
using System.Collections.Generic;
using UnityEngine;
public class Father { }
public class Son : Father { }
public class Reflection : MonoBehaviour
{void Start(){1、判断A对象是否让B对象分配空间//父类装子类//是否可以从某一个类型的对象为自己分配空间Type fatherType = typeof(Father);Type sonType = typeof(Son);//调用者通过IsAssignableFrom方法进行判断,是否可以通过传入的类型为自己分配空间if (fatherType.IsAssignableFrom(sonType)){print("可以分配");Father f = Activator.CreateInstance(sonType) as Father;print(f);}else{print("不能分配");}2、通过反射获取泛型类型List<string> list = new List<string>();Type listType = list.GetType();//通过得到泛型类的类型,得到泛型具体的类型Type[] types = listType.GetGenericArguments();print(types[0]);Dictionary<string,float> dict = new Dictionary<string,float>();Type dicType = dict.GetType();types = dicType.GetGenericArguments();print(types[0]);print(types[1]);}
}

2、需求分析 Playerprefs数据管理类创建

Test

using System.Collections.Generic;
using UnityEngine;public class PlayerInfo
{public int age = 10;public string name = "姓名";public float height = 188.5f;public bool sex = true;public List<int> list = new List<int>() { 1, 2, 3, 4, };public Dictionary<int, string> dic = new Dictionary<int, string>(){{1,"123" },{1,"123" }};public ItemInfo itemInfo = new ItemInfo(3, 33);public List<ItemInfo> items = new List<ItemInfo>() { new ItemInfo(1, 99), new ItemInfo(2, 22) };public Dictionary<int, ItemInfo> itemDic = new Dictionary<int, ItemInfo>() { { 4, new ItemInfo(4, 44) }, { 5, new ItemInfo(5, 55) } };
}
public class ItemInfo
{public int num;public int id;public ItemInfo() { }public ItemInfo(int id, int num){this.id = id;this.num = num;}
}
public class Test : MonoBehaviour
{void Start(){PlayerInfo p = new PlayerInfo();PlayerPrefsDataMgr.Instance.SaveData(p, "Player1");}
}

3、反射存储数据-常用成员、List成员、Dic成员、自定义类成员

using System;
using System.Collections;
using System.Reflection;
using UnityEngine;
/// <summary>
/// PlayerPrefs数据管理类,同一管理数据的存储和读取
/// </summary>
public class PlayerPrefsDataMgr
{private static PlayerPrefsDataMgr instance = new PlayerPrefsDataMgr();public static PlayerPrefsDataMgr Instance{get { return instance; }}private PlayerPrefsDataMgr() { }/// <summary>/// 存储数据/// </summary>/// <param name="data">数据对象</param>/// <param name="keyName">数据对象的唯一key,自己控制</param>public void SaveData(object data, string keyName){//通过Type得到传入数据对象的所有字段,结合PlayerPrefs来存储//1、获取传入数据对象的所有字段Type dataType = data.GetType();//得到所有字段FieldInfo[] infos = dataType.GetFields();//2、自己定义一个key的规则,进行数据存储//keyName_数据类型_字段类型_字段名//3、遍历字段,进行数据存储string saveKeyNmae = "";FieldInfo info;for (int i = 0; i < infos.Length; i++){//对每一个字段,进行数据存储//得到具体的字段信息info = infos[i];//通过FieldInfo可以直接获取到字段的类型和字段的名字//    字段的类型 info.FieldType.Name//    字段的名字 info.Name//根据key生成key//    Player1_PlayerInfo_Int32_agesaveKeyNmae = keyName + "_" + dataType.Name + "_" + info.FieldType.Name + "_" + info.Name;//获取值//info.GetValue(data)SaveData(info.GetValue(data), saveKeyNmae);}}/// <summary>/// /// </summary>/// <param name="value">类型</param>/// <param name="keyName">存储的key名称</param>private void SaveValue(object value, string keyName){Type fieldType = value.GetType();if (fieldType == typeof(int)){Debug.Log("存储int" + keyName);PlayerPrefs.SetInt(keyName, (int)value);}else if (fieldType == typeof(float)){Debug.Log("存储float" + keyName);PlayerPrefs.SetFloat(keyName, (float)value);}else if (fieldType == typeof(string)){Debug.Log("存储string" + keyName);PlayerPrefs.SetString(keyName, value.ToString());}else if (fieldType == typeof(bool)){Debug.Log("存储bool" + keyName);PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0);}//通过IList判断这个类是否为Listelse if (typeof(IList).IsAssignableFrom(fieldType)){Debug.Log("存储List" + keyName);IList list = value as IList;//存储List数量PlayerPrefs.SetInt(keyName, list.Count);int index = 0;foreach (object obj in list){SaveValue(obj, keyName + index);index++;}}else if (typeof(IDictionary).IsAssignableFrom(fieldType)){Debug.Log("存储Dictionary" + keyName);IDictionary dic = value as IDictionary;//存储字典长度PlayerPrefs.SetInt(keyName,dic.Count);//遍历存储Dic里面的具体值int index = 0;foreach (object key in dic.Keys){SaveValue(key, keyName + "_key_" + index);SaveValue(dic[key], keyName + "_value_" + index);index++;}}else{SaveData(value, keyName);}}/// <summary>/// 读取数据/// </summary>/// <param name="type">想要读取数据的数据类型</param>/// <param name="keyName">数据对象的唯一key</param>/// <returns></returns>public object LoadData(Type type, string keyName){//只需要传入一个Type,typeof(Player),就可以在内部动态创建一个对象返回出来//根据传入的类型和keyName,依据存储数据时key的拼接规则来进行数据的获取赋值,然后返回出去return null;}
}

4、反射读取数据-常用成员、List成员、Dic成员、自定义类成员

test

using System.Collections.Generic;
using UnityEngine;public class PlayerInfo
{public int age;public string name = "姓名";public float height;public bool sex;public List<int> list;public Dictionary<int, string> dic;public ItemInfo itemInfo;public List<ItemInfo> itemList;public Dictionary<int, ItemInfo> itemDic;
}
public class ItemInfo
{public int num;public int id;public ItemInfo() { }public ItemInfo(int id, int num){this.id = id;this.num = num;}
}
public class Test : MonoBehaviour
{void Start(){//PlayerInfo p = new PlayerInfo();将数据对象的信息存储到硬盘//PlayerPrefsDataMgr.Instance.SaveData(p, "Player1");//PlayerPrefs.DeleteAll();//读取数据PlayerInfo p = PlayerPrefsDataMgr.Instance.LoadData(typeof(PlayerInfo), "Player1") as PlayerInfo;//游戏逻辑p.age = 18;p.name = "姓名";p.height = 183;p.sex = true;p.itemList.Add(new ItemInfo(1,99));p.itemList.Add(new ItemInfo(2,22));p.itemDic.Add(3, new ItemInfo(3, 33));p.itemDic.Add(4, new ItemInfo(4, 44));//游戏数据存储PlayerPrefsDataMgr.Instance.SaveData(p, "player1");}
}

PlayerPrefsDataMgr

using System;
using System.Collections;
using System.Reflection;
using UnityEngine;
/// <summary>
/// PlayerPrefs数据管理类,同一管理数据的存储和读取
/// </summary>
public class PlayerPrefsDataMgr
{private static PlayerPrefsDataMgr instance = new PlayerPrefsDataMgr();public static PlayerPrefsDataMgr Instance{get { return instance; }}private PlayerPrefsDataMgr() { }/// <summary>/// 存储数据/// </summary>/// <param name="data">数据对象</param>/// <param name="keyName">数据对象的唯一key,自己控制</param>public void SaveData(object data, string keyName){//通过Type得到传入数据对象的所有字段,结合PlayerPrefs来存储//1、获取传入数据对象的所有字段Type dataType = data.GetType();//得到所有字段FieldInfo[] infos = dataType.GetFields();//2、自己定义一个key的规则,进行数据存储//keyName_数据类型_字段类型_字段名//3、遍历字段,进行数据存储string saveKeyNmae = "";FieldInfo info;for (int i = 0; i < infos.Length; i++){//对每一个字段,进行数据存储//得到具体的字段信息info = infos[i];//通过FieldInfo可以直接获取到字段的类型和字段的名字//    字段的类型 info.FieldType.Name//    字段的名字 info.Name//根据key生成key//    Player1_PlayerInfo_Int32_agesaveKeyNmae = keyName + "_" + dataType.Name + "_" + info.FieldType.Name + "_" + info.Name;//获取值//info.GetValue(data)SaveData(info.GetValue(data), saveKeyNmae);}PlayerPrefs.Save();}/// <summary>/// /// </summary>/// <param name="value">类型</param>/// <param name="keyName">存储的key名称</param>private void SaveValue(object value, string keyName){Type fieldType = value.GetType();if (fieldType == typeof(int)){Debug.Log("存储int" + keyName);PlayerPrefs.SetInt(keyName, (int)value);}else if (fieldType == typeof(float)){Debug.Log("存储float" + keyName);PlayerPrefs.SetFloat(keyName, (float)value);}else if (fieldType == typeof(string)){Debug.Log("存储string" + keyName);PlayerPrefs.SetString(keyName, value.ToString());}else if (fieldType == typeof(bool)){Debug.Log("存储bool" + keyName);PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0);}//通过IList判断这个类是否为Listelse if (typeof(IList).IsAssignableFrom(fieldType)){Debug.Log("存储List" + keyName);IList list = value as IList;//存储List数量PlayerPrefs.SetInt(keyName, list.Count);int index = 0;foreach (object obj in list){SaveValue(obj, keyName + index);index++;}}else if (typeof(IDictionary).IsAssignableFrom(fieldType)){Debug.Log("存储Dictionary" + keyName);IDictionary dic = value as IDictionary;//存储字典长度PlayerPrefs.SetInt(keyName,dic.Count);//遍历存储Dic里面的具体值int index = 0;foreach (object key in dic.Keys){SaveValue(key, keyName + "_key_" + index);SaveValue(dic[key], keyName + "_value_" + index);index++;}}else{SaveData(value, keyName);}}/// <summary>/// 读取数据/// </summary>/// <param name="type">想要读取数据的数据类型</param>/// <param name="keyName">数据对象的唯一key</param>/// <returns></returns>public object LoadData(Type type, string keyName){//只需要传入一个Type,typeof(Player),就可以在内部动态创建一个对象返回出来//根据传入的类型和keyName,依据存储数据时key的拼接规则来进行数据的获取赋值,然后返回出去//根据传入的Type创建一个对象,用于存储数据object data = Activator.CreateInstance(type);//要在这个new出来的对象中存储数据FieldInfo[] infos = type.GetFields();//用于拼接key的字符串string loadKeyName = "";//用于存储单个字段信息的对象FieldInfo info;for (int i = 0; i < infos.Length; i++){info = infos[i];loadKeyName = keyName + "_" + type.Name + "_" + info.FieldType.Name + "_" + info.Name;//填充数据到data中info.SetValue(data, LoadValue(info.FieldType, loadKeyName));}return data;}/// <summary>/// 得到单个数据的方法/// </summary>/// <param name="fieldType">字段类型,用于判断API的读取</param>/// <param name="keyName">唯一key,获取Value</param>/// <returns></returns>private object LoadValue(Type fieldType,string keyName){//根据字段类型if (fieldType == typeof(int)){return PlayerPrefs.GetInt(keyName, 0);}else if (fieldType == typeof(float)){return PlayerPrefs.GetFloat(keyName, 0);}else if (fieldType == typeof(string)){return PlayerPrefs.GetString(keyName, "");}else if(fieldType == typeof(bool)){return PlayerPrefs.GetInt(keyName, 0) == 1 ? true : false;}else if (typeof(IList).IsAssignableFrom(fieldType)){//得到List长度int count = PlayerPrefs.GetInt(keyName, 0);//实例化一个List对象类进行赋值IList list = Activator.CreateInstance(fieldType) as IList;for (int i = 0; i < count; i++){//得到List中泛型的类型list.Add(LoadValue(fieldType.GetGenericArguments()[0], keyName + i));}return list;}else if (typeof(IDictionary).IsAssignableFrom(fieldType)){//得到字典dictionary的长度int count = PlayerPrefs.GetInt(keyName, 0);//实例化字典对象IDictionary dic = Activator.CreateInstance(fieldType) as IDictionary;Type[] kvType = fieldType.GetGenericArguments();for (int i = 0; i < count; i++){dic.Add(LoadValue(kvType[0], keyName + "_key_" + i), LoadValue(kvType[1], keyName + "_value_" + i));}return dic;}else{return LoadData(fieldType, keyName);}}
}

4、加密思路

//为int数据加密
int rValue = (int)value;
rValue += 10;
PlayerPrefs.SetInt(keyName, rValue);
//解密
return PlayerPrefs.GetInt(keyName, 0) - 10;

5、生成资源包

Export Package

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/365286.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springcloud第4季 分布式事务seata实现AT模式案例2【经典案例】

一 seata案例 1.1 背景说明 本案例使用seata的at模式&#xff0c;模拟分布式事务场景&#xff1a;【下订单&#xff0c;减库存&#xff0c;扣余额&#xff0c;改状态】 AT模式原理&#xff1a;是2pc方案的演变&#xff0c; 一阶段&#xff1a;业务数据和回滚日志记录在同一…

九浅一深Jemalloc5.3.0 -- ②浅*size class

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是极其枯燥的&#xff0c;…

DB2数据库日常维护

一、DB2系统结构 创建实例 db2icrt 实例名 删除实例 db2idrop 实例名 查询实例 db2ilist 实例名 启动实例 db2start 停止实例 db2stop 创建数据库 create database 库名 [on 存储路径] [using codeset 字符集] [TERRITORY 区域码] [pagesize 页大小] 删除数据库 drop database…

网安小贴士(2)OSI七层模型

一、前言 OSI七层模型是一种网络协议参考模型&#xff0c;用于描述计算机网络体系结构中的不同层次和功能。它由国际标准化组织 (ISO) 在1984年开发并发布。 二、定义 OSI七层模型&#xff0c;全称为开放式系统互联通信参考模型&#xff08;Open Systems Interconnection Refe…

VTK学习日志:基于VTK9.3.0+Visual Studio c++实现DICOM影像MPR多平面重建+V R体绘制4个视图展示功能的实现(二)

前段时间对VTK9.3.0进行了编译&#xff0c;开发了MPRVR实现的demo,显示效果不是很理想&#xff0c;正好趁着周末有时间&#xff0c;再度对之前的程序进行优化和完善&#xff0c;先展示下效果&#xff1a; VTK实现MPRVR四视图 再次讲解下基于VTK的MPRVR实现的简单项目创建过程&a…

Cherno 游戏引擎笔记 (45~60)

有几个部分的笔记以图片形式呈现&#xff08;如果没找到文本可以查看是否遗漏了图片笔记&#xff09; My Github REPO(GitHub - JJJJJJJustin/Nut: The game_engine which learned from Cherno) 源码笔记&#xff0c;希望帮到你 :-} ---Shader Library&#xff08;着色器库&…

区间动态规划——最长回文子序列长度(C++)

把夜熬成粥&#xff0c;然后喝了它。 ——2024年7月1日 书接上回&#xff1a;区间动态规划——最长回文子串&#xff08;C&#xff09;-CSDN博客&#xff0c;大家有想到解决办法吗&#xff1f; 题目描述 给定一个字符串s&#xff08;s仅由数字和英文大小写字母组成&#xff0…

9*AGV,669万,海康,中!

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 如下是近期&#xff0c;几个智能物流相关的中标项目。 红云红河集团物流中心新建烟叶仓储设施项目智能叉车购置项目 本次项目主要包括以下三个方面的采购和实施&#xff1a; (1) 智能…

独一无二的设计模式——单例模式(Java实现)

1. 引言 亲爱的读者们&#xff0c;欢迎来到我们的设计模式专题&#xff0c;今天的讲解的设计模式&#xff0c;还是单例模式哦&#xff01;上次讲解的单例模式是基于Python实现&#xff08;独一无二的设计模式——单例模式&#xff08;python实现&#xff09;&#xff09;的&am…

[leetcode]squares-of-a-sorted-array. 有序数组的平方

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int n nums.size();vector<int> ans(n);for (int i 0, j n - 1, pos n - 1; i < j;) {if (nums[i] * nums[i] > nums[j] *…

春秋云境:CVE-2022-25411[漏洞复现]

根据题目提示和CNNVD优先寻找后台管理地址 靶机启动后&#xff0c;使用AWVS进行扫描查看网站结构 在这里可以看到后台管理的登录地址&#xff1a;/admin/&#xff0c;根据题目提示可知是弱口令 尝试admin、123456、admin666、admin123、admin888...等等常见弱口令 正确的账户…

java笔记(30)——反射的 API 及其 使用

文章目录 反射1. 什么是反射2. 获取class字段&#xff08;字节码文件对象&#xff09;方式1方式2方式3应用 3. 获取构造方法和权限修饰符前期准备获取所有的公共构造方法获取所有的构造方法获取无参构造方法获取一个参数的构造方法获取一个参数的构造方法获取两个参数的构造方法…

【日常记录】【JS】SSE 流式传输 ChatGPT 的网络传输模式

文章目录 1、SSE 流式传输2、后端代码3、前端代码5、SSE和WS 对比6、chatgpt SSE的服务端返回的数据参考链接 单工通信是一种单向的通信方式&#xff0c;其中信息只能从发送端传输到接收端&#xff0c;而接收端不能向发送端发送任何信息。在Web开发中&#xff0c;Server-Sent E…

FL Studio 21 中文版分享(内含破解补丁)不是标题党

不知道为什么现在钓鱼的这么多&#xff08;有答案的请在评论区上告诉我&#xff09;&#xff0c;就一个学习版的编曲软件有必要这样子搞吗&#xff1f;我也是在各类博客上找了一大堆教程&#xff0c;根本没几个能用的&#xff0c;索性直接到兔八哥爱分享上找了一个&#xff0c;…

C程序设计谭浩强第五版

程序习题 第一章1、第5题2、第6题 第三章1、第2题2、第2题3、第3题4、第4题Tips 第一章 1、第5题 编写一个C程序,运行时输出以下图形: #include <stdio.h> int main() {for (int i 0; i < 4; i) // 输出4行循环控制{for (int j 0; j < i; j) //第几行就输出几…

【TB作品】玩具电子琴,ATMEGA128单片机,Proteus仿真

题目 7 &#xff1a;玩具电子琴 基于单片机设计一能够发出中音八个音阶的音乐信号的电子琴&#xff0c;能够实现弹奏和音符显示功 能。 具有 8 个音阶按键&#xff0c;每按下一个按键时&#xff0c;所对应的 LED 点亮&#xff0c;音符进行显示。 具体要求如下&#xff1a; &…

PV操作经典例题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文☀️☀️☀️1.水果问题2.和尚打水问题3.餐厅职员问题4.汽车站点问题5.观察者-报告者问题6..阅览室问题 …

DEBOPIE框架:打造最好的ChatGPT交易机器人

本文介绍了如何利用 DEBOPIE 框架并基于 ChatGPT 创建高效交易机器人&#xff0c;并强调了在使用 AI 辅助交易时需要注意的限制以及操作步骤。原文: Build the Best ChatGPT Trading Bots with my “DEBOPIE” Framework 如今有大量文章介绍如何通过 ChatGPT 帮助决定如何以及在…

win10修改远程桌面端口,Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南

Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南 一、修改Windows 10远程桌面端口 在Windows 10系统中&#xff0c;远程桌面连接默认使用3389端口。为了安全起见&#xff0c;建议修改此端口以减少潜在的安全风险。以下是修改远程桌面端口的步骤&#xff1a; 1. 打…

任务调度器——任务切换

一、开启任务调度器 函数原型&#xff1a; void vTaskStartScheduler( void ) 作用&#xff1a;用于启动任务调度器&#xff0c;任务调度器启动后&#xff0c; FreeRTOS 便会开始进行任务调度 内部实现机制&#xff08;以动态创建为例&#xff09;&#xff1a; &#xff0…