当前位置:网站首页>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}毫秒");
}
}
边栏推荐
- MySQL splits strings for conditional queries
- 开发者,云原生数据库是未来吗?
- 关于 Notion-Like 工具的反思和畅想
- 实现 1~number 之间,所有数字的加和
- Taobao short video, why the worse the effect
- Rocky基础知识1
- 数据泄露怎么办?'华生·K'7招消灭安全威胁
- 初次使用腾讯云,解决只能使用webshell连接,不能使用ssh连接。
- 关于 SAP UI5 floating footer 显示与否的单步调试以及使用 SAP UI5 的收益
- Developers, is cloud native database the future?
猜你喜欢
【Nacos云原生】阅读源码第一步,本地启动Nacos
Binder通信过程及ServiceManager创建过程
leetcode:221. 最大正方形【dp状态转移的精髓】
数据湖(七):Iceberg概念及回顾什么是数据湖
STM32 and motor development (from architecture diagram to documentation)
SAP SEGW 事物码里的导航属性(Navigation Property) 和 EntitySet 使用方法
使用 jMeter 对 SAP Spartacus 进行并发性能测试
It's too convenient. You can complete the code release and approval by nailing it!
Four common problems of e-commerce sellers' refund and cash return, with solutions
《2022年中国银行业RPA供应商实力矩阵分析》研究报告正式启动
随机推荐
初次使用腾讯云,解决只能使用webshell连接,不能使用ssh连接。
uni-app开发语音识别app,讲究的就是简单快速。
石臻臻的2021总结和2022展望 | 文末彩蛋
时钟周期
SAP SEGW 事物码里的 ABAP Editor
逆波兰表达式
SAP ui5 objectpagelayout control usage sharing
Lb10s-asemi rectifier bridge lb10s
RHCSA8
Simple page request and parsing cases
Shi Zhenzhen's 2021 summary and 2022 outlook | colorful eggs at the end of the article
Hundred days to complete the open source task of the domestic database opengauss -- openguass minimalist version 3.0.0 installation tutorial
How do e-commerce sellers refund in batches?
About the single step debugging of whether SAP ui5 floating footer is displayed or not and the benefits of using SAP ui5
Halcon template matching actual code (I)
Rocky basics 1
Reflection and imagination on the notation like tool
MySQL giant pit: update updates should be judged with caution by affecting the number of rows!!!
DataPipeline双料入选中国信通院2022数智化图谱、数据库发展报告
关于 SAP UI5 floating footer 显示与否的单步调试以及使用 SAP UI5 的收益