C# 对象存储 (轻松实现序列化 | Xml | Json | 加密 | 压缩 | 注册表 | Redis)

简介: 开发时经常会遇到需要保存配置的情况,最常见的实现方式是将对象序列化成Json,再写入文件并保存到本地磁盘。本文将使用开源库**ApeFree.DataStore**来替换原有的对象存储过程,实现一个可以随意切换存储方式的对象存储方法。ApeFree.DataStore是一款可配置的对象存储库,支持在不同平台/介质中对内存中的对象进行存储与还原(如本地存储、注册表存储)。支持配置序列化格式(如Json、Xml),支持配置压缩算法(如GZip、Defalte),支持配置加密算法(如AES、RSA)。

在这里插入图片描述

C# 对象存储

@[toc]

前言

开发时经常会遇到需要保存配置的情况,最常见的实现方式是将对象序列化成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 LocalStoreAccessSettings("./config/student.conf");

            // 本地存储器
            IStore<Student> store = StoreFactory.Factory.CreateLocalStore<Student>(settings);

示例二、Xml格式的本地存储器

            // 本地存储配置
            var settings = new LocalStoreAccessSettings("./config/student.conf") {
   
    
                SerializationAdapter = new XmlSerializationAdapter()
            };

            // 本地存储器
            IStore<Student> store = StoreFactory.Factory.CreateLocalStore<Student>(settings);

示例三、Xml格式(采用GZip压缩算法)的本地存储器

            // 本地存储配置
            var settings = new LocalStoreAccessSettings("./config/student.conf") {
   
    
                SerializationAdapter = new XmlSerializationAdapter(),
                CompressionAdapter = new GZipCompressionAdapter(),
            };

            // 本地存储器
            IStore<Student> store = StoreFactory.Factory.CreateLocalStore<Student>(settings);

示例四、Xml格式(采用AES加密)的本地存储器

ASE密钥:12345678901234567890123456789012
AES向量:0123456789abcdef

            // 本地存储配置
            var settings = new LocalStoreAccessSettings("./config/student.conf") {
   
    
                SerializationAdapter = new XmlSerializationAdapter(),
                EncryptionAdapter = new AesEncryptionAdapter("12345678901234567890123456789012".GetBytes(), "0123456789abcdef".GetBytes()),
            };

            // 本地存储器
            IStore<Student> store = StoreFactory.Factory.CreateLocalStore<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}毫秒");
        }
    }
相关实践学习
对象存储OSS快速上手——如何使用ossbrowser
本实验是对象存储OSS入门级实验。通过本实验,用户可学会如何用对象OSS的插件,进行简单的数据存、查、删等操作。
相关文章
|
API C# Windows
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
5407 0
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
|
数据可视化 开发工具 git
git可视化工具Sourcetree使用全攻略(包括各种git冲突解决)(二)
git可视化工具Sourcetree使用全攻略(包括各种git冲突解决)
git可视化工具Sourcetree使用全攻略(包括各种git冲突解决)(二)
|
Web App开发 自然语言处理 前端开发
可访问性测试(无障碍测试)
可访问性测试(无障碍测试)
840 0
可访问性测试(无障碍测试)
|
缓存 数据可视化 C#
WPF技术之Frame控件
WPF (Windows Presentation Foundation) Frame是WPF中的一个控件,它在应用程序中提供了一个容器,用于加载和显示其他页面或用户界面元素。
2316 0
|
运维 监控 数据可视化
一文详解:工业软件“低代码开发平台”技术架构研究与分析
本文围绕工业软件低代码开发平台的机遇与挑战,提出基于自动化引擎的技术架构,由工具链、引擎库、模型库、组件库、工业数据网关和应用门户组成。文章分析了其在快速开发、传统系统升级中的应用模式及价值,如缩短创新周期、降低试错成本、解决资源缺乏和提升创新可复制性,为我国工业软件产业发展提供参考和支持。
|
IDE PHP 开发工具
JetBrains PhpStorm 2025.1 发布 - 高效智能的 PHP IDE
JetBrains PhpStorm 2025.1 (macOS, Linux, Windows) - 高效智能的 PHP IDE
1004 1
|
iOS开发 MacOS
mac电脑如何用命令打开或压缩rar文件包 - 草稿
工作中总是会遇到压缩包是rar格式的,mac系统默认支持解压和压缩zip文件,但不支持rar格式的,今天尝试了下用命令解压,顺便记录一下,分享给需要的人。
mac电脑如何用命令打开或压缩rar文件包 - 草稿
|
XML 存储 JSON
c#XML、JSON的序列化和反序列化,看完你就懂了
c#XML、JSON的序列化和反序列化,看完你就懂了
793 0
|
存储 C# 数据库
C# 生成唯一ID,有哪些方法?
【2月更文挑战第12天】
1957 0

热门文章

最新文章