当前位置:网站首页>C# 对象存储
C# 对象存储
2022-07-05 12:55:00 【猿长大人】
C# 对象存储
文章目录
前言
开发时经常会遇到需要保存配置的情况,最常见的实现方式是将对象序列化成Json,再写入文件并保存到本地磁盘。
本文将使用开源库ApeFree.DataStore来替换原有的对象存储过程,实现一个可以随意切换存储方式的对象存储方法。
关于DataStore
ApeFree.DataStore是一款可配置的对象存储库,支持在不同平台/介质中对内存中的对象进行存储与还原(如本地存储、注册表存储)。支持配置序列化格式(如Json、Xml),支持配置压缩算法(如GZip、Defalte),支持配置加密算法(如AES、RSA)。
开源地址:https://github.com/landriesnidis/ApeFree.DataStore
示例代码
实体类
创建一个用于测试的实体类型,预设了初始值;
/// <summary>
/// 学生(测试实体类)
/// </summary>
public class Student
{
public long Id {
get; set; } = 2022030511;
public string Name {
get; set; } = "张三";
public DateTime DateOfBirth {
get; set; } = new DateTime(2013, 6, 1);
public string ClassName {
get; set; } = "A班";
public string Description {
get; set; } = "平平无奇的学生";
public bool IsYoungPioneer {
get; set; } = true;
public string Address {
get; set; } = "二仙桥成华大道8号";
}
创建对象存储器
示例一、Json格式的本地存储器
// 本地存储配置(默认使用Json格式)
var settings = new LoaclStoreAccessSettings("./config/student.conf");
// 本地存储器
IStore<Student> store = StoreFactory.Factory.CreateLoaclStore<Student>(settings);
示例二、Xml格式的本地存储器
// 本地存储配置
var settings = new LoaclStoreAccessSettings("./config/student.conf") {
SerializationAdapter = new XmlSerializationAdapter()
};
// 本地存储器
IStore<Student> store = StoreFactory.Factory.CreateLoaclStore<Student>(settings);
示例三、Xml格式(采用GZip压缩算法)的本地存储器
// 本地存储配置
var settings = new LoaclStoreAccessSettings("./config/student.conf") {
SerializationAdapter = new XmlSerializationAdapter(),
CompressionAdapter = new GZipCompressionAdapter(),
};
// 本地存储器
IStore<Student> store = StoreFactory.Factory.CreateLoaclStore<Student>(settings);
示例四、Xml格式(采用AES加密)的本地存储器
ASE密钥:12345678901234567890123456789012
AES向量:0123456789abcdef
// 本地存储配置
var settings = new LoaclStoreAccessSettings("./config/student.conf") {
SerializationAdapter = new XmlSerializationAdapter(),
EncryptionAdapter = new AesEncryptionAdapter("12345678901234567890123456789012".GetBytes(), "0123456789abcdef".GetBytes()),
};
// 本地存储器
IStore<Student> store = StoreFactory.Factory.CreateLoaclStore<Student>(settings);
示例五、Xml格式(Deflate+AES)的注册表存储器
注意Deflate+AES纯粹是为了演示配置的用法:
// 注册表存储配置
var settings = new RegistryStoreAccessSettings(RegistryHive.CurrentUser, @"ApeFree\DataStore\Demo","student") {
SerializationAdapter = new XmlSerializationAdapter(),
CompressionAdapter = new DeflateCompressionAdapter(),
EncryptionAdapter = new AesEncryptionAdapter("12345678901234567890123456789012".GetBytes(), "0123456789abcdef".GetBytes()),
};
// 注册表存储器
IStore<Student> store = StoreFactory.Factory.CreateRegistryStore<Student>(settings);
测试窗体
public partial class EditForm : Form
{
private IStore<Student> store;
public EditForm(IStore<Student> store) : this()
{
this.store = store;
tsmiLoad.PerformClick();
}
private EditForm()
{
InitializeComponent();
}
private void tsmiLoad_Click(object sender, EventArgs e)
{
store.Load();
propertyGrid.SelectedObject = store.Value;
}
private void tsmiSave_Click(object sender, EventArgs e)
{
store.Save();
Close();
}
private void tsmiTestIO_Click(object sender, EventArgs e)
{
int times = 1000;
Stopwatch watch = new Stopwatch();
watch.Restart();
for (int i = 0; i < times; i++)
{
store.Load();
store.Save();
}
watch.Stop();
// 计算耗时(毫秒)
var elapsedTime = watch.ElapsedTicks * 1000.0 / Stopwatch.Frequency;
MessageBox.Show($"存取{
times}次测试完毕。\r\n" +
$"总耗时:{
elapsedTime}毫秒。\r\n" +
$"平均单次读取+保存耗时:{
elapsedTime / times}毫秒");
}
}
边栏推荐
- 解决 UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xa2 in position 107
- 《2022年中國銀行業RPA供應商實力矩陣分析》研究報告正式啟動
- 潘多拉 IOT 开发板学习(HAL 库)—— 实验7 窗口看门狗实验(学习笔记)
- [Nacos cloud native] the first step of reading the source code is to start Nacos locally
- RHCSA3
- 无密码身份验证如何保障用户隐私安全?
- A small talk caused by the increase of sweeping
- MySQL splits strings for conditional queries
- 程序员成长第八篇:做好测试工作
- RHCSA8
猜你喜欢
Reverse Polish notation
MySQL 巨坑:update 更新慎用影响行数做判断!!!
数据湖(七):Iceberg概念及回顾什么是数据湖
ABAP editor in SAP segw transaction code
Overflow toolbar control in SAP ui5 view
946. Verify stack sequence
LB10S-ASEMI整流桥LB10S
Datapipeline was selected into the 2022 digital intelligence atlas and database development report of China Academy of communications and communications
How to protect user privacy without password authentication?
Alipay transfer system background or API interface to avoid pitfalls
随机推荐
聊聊异步编程的 7 种实现方式
Taobao short video, why the worse the effect
How to realize batch sending when fishing
数据泄露怎么办?'华生·K'7招消灭安全威胁
946. Verify stack sequence
《2022年中国银行业RPA供应商实力矩阵分析》研究报告正式启动
ASEMI整流桥HD06参数,HD06图片,HD06应用
Notes for preparation of information system project manager --- information knowledge
Hiengine: comparable to the local cloud native memory database engine
自然语言处理从小白到精通(四):用机器学习做中文邮件内容分类
How do e-commerce sellers refund in batches?
Natural language processing series (I) introduction overview
Simple page request and parsing cases
Realize the addition of all numbers between 1 and number
APICloud Studio3 API管理与调试使用教程
开发者,云原生数据库是未来吗?
【服务器数据恢复】某品牌服务器存储raid5数据恢复案例
Compile kernel modules separately
UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xe6 in position 76131: invalid continuation byt
Discussion on error messages and API versions of SAP ui5 getsaplogonlanguage is not a function