当前位置:网站首页>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}毫秒");
}
}
边栏推荐
- RHCSA3
- Taobao product details API | get baby SKU, main map, evaluation and other API interfaces
- 蜀天梦图×微言科技丨达梦图数据库朋友圈+1
- 函数传递参数小案例
- 你的下一台电脑何必是电脑,探索不一样的远程操作
- mysql econnreset_Nodejs 套接字报错处理 Error: read ECONNRESET
- A specific example of ABAP type and EDM type mapping in SAP segw transaction code
- Yyds dry inventory JS intercept file suffix
- 155. Minimum stack
- 使用 jMeter 对 SAP Spartacus 进行并发性能测试
猜你喜欢

Overflow toolbar control in SAP ui5 view

Flutter 绘制波浪移动动画效果,曲线和折线图

石臻臻的2021总结和2022展望 | 文末彩蛋

LB10S-ASEMI整流桥LB10S

CF:A. The Third Three Number Problem【关于我是位运算垃圾这个事情】

Taobao product details API | get baby SKU, main map, evaluation and other API interfaces

SAP UI5 DynamicPage 控件介绍

Lepton 无损压缩原理及性能分析

MySQL giant pit: update updates should be judged with caution by affecting the number of rows!!!
![[cloud native] use of Nacos taskmanager task management](/img/ad/24bdd4572ef9990238913cb7cd16f8.png)
[cloud native] use of Nacos taskmanager task management
随机推荐
数据泄露怎么办?'华生·K'7招消灭安全威胁
开发者,云原生数据库是未来吗?
SAP SEGW 事物码里的导航属性(Navigation Property) 和 EntitySet 使用方法
MySQL splits strings for conditional queries
程序员成长第八篇:做好测试工作
从外卖点单浅谈伪需求
A deep long article on the simplification and acceleration of join operation
聊聊异步编程的 7 种实现方式
uni-app开发语音识别app,讲究的就是简单快速。
MySQL giant pit: update updates should be judged with caution by affecting the number of rows!!!
Vonedao solves the problem of organizational development effectiveness
SAP SEGW 事物码里的 ABAP 类型和 EDM 类型映射的一个具体例子
ABAP editor in SAP segw transaction code
Small case of function transfer parameters
RHCSA4
量价虽降,商业银行结构性存款为何受上市公司所偏爱?
Binder通信过程及ServiceManager创建过程
Halcon 模板匹配实战代码(一)
Pandora IOT development board learning (HAL Library) - Experiment 7 window watchdog experiment (learning notes)
HiEngine:可媲美本地的云原生内存数据库引擎