• C# 对象存储


    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号";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    创建对象存储器

    示例一、Json格式的本地存储器

                // 本地存储配置(默认使用Json格式)
                var settings = new LoaclStoreAccessSettings("./config/student.conf");
    
                // 本地存储器
                IStore<Student> store = StoreFactory.Factory.CreateLoaclStore<Student>(settings);
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

                // 本地存储配置
                var settings = new LoaclStoreAccessSettings("./config/student.conf") { 
                    SerializationAdapter = new XmlSerializationAdapter()
                };
    
                // 本地存储器
                IStore<Student> store = StoreFactory.Factory.CreateLoaclStore<Student>(settings);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

                // 本地存储配置
                var settings = new LoaclStoreAccessSettings("./config/student.conf") { 
                    SerializationAdapter = new XmlSerializationAdapter(),
                    CompressionAdapter = new GZipCompressionAdapter(),
                };
    
                // 本地存储器
                IStore<Student> store = StoreFactory.Factory.CreateLoaclStore<Student>(settings);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    示例四、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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    示例五、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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    测试窗体

    在这里插入图片描述

        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}毫秒");
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
  • 相关阅读:
    大学生餐饮主题网页制作 美食网页设计模板 学生静态网页作业成品 dreamweaver美食甜品蛋糕HTML网站制作
    Flink之窗口聚合算子
    NLog配置文件详解
    go语言输出带颜色字体
    Glide加载图片占位图问题,CustomViewTarget加载图片占位图问题
    希望计算机专业同学都知道这些老师
    详细javaweb基础
    devops-1:代码仓库git的使用
    ArcGis课程设计
    【数据结构】6.1 二叉树(C语言)
  • 原文地址:https://blog.csdn.net/lgj123xj/article/details/125592232