当前位置:   article > 正文

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

apefree.datastore

在这里插入图片描述

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 LocalStoreAccessSettings("./config/student.conf");

            // 本地存储器
            IStore<Student> store = StoreFactory.Factory.CreateLocalStore<Student>(settings);
  • 1
  • 2
  • 3
  • 4
  • 5
示例二、Xml格式的本地存储器
            // 本地存储配置
            var settings = new LocalStoreAccessSettings("./config/student.conf") { 
                SerializationAdapter = new XmlSerializationAdapter()
            };

            // 本地存储器
            IStore<Student> store = StoreFactory.Factory.CreateLocalStore<Student>(settings);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
示例三、Xml格式(采用GZip压缩算法)的本地存储器
            // 本地存储配置
            var settings = new LocalStoreAccessSettings("./config/student.conf") { 
                SerializationAdapter = new XmlSerializationAdapter(),
                CompressionAdapter = new GZipCompressionAdapter(),
            };

            // 本地存储器
            IStore<Student> store = StoreFactory.Factory.CreateLocalStore<Student>(settings);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
示例四、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);
  • 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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/554287
推荐阅读
相关标签
  

闽ICP备14008679号