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的插件,进行简单的数据存、查、删等操作。
相关文章
|
11月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
543 1
|
11月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
480 1
|
12月前
|
XML JSON 编解码
从JSON到Protobuf,深入序列化方案的选型与原理
序列化是数据跨边界传输的“翻译官”,将结构化数据转为二进制流。JSON可读性强但冗余大,Protobuf高效紧凑、性能优越,成主流选择。不同场景需权衡标准化与定制优化,选最合适方案。
689 3
|
JSON 人工智能 Go
在Golang中序列化JSON字符串的教程
在Golang中,使用`json.Marshal()`可将数据结构序列化为JSON格式。若直接对JSON字符串进行序列化,会因转义字符导致错误。解决方案包括使用`[]byte`或`json.RawMessage()`来避免双引号被转义,从而正确实现JSON的序列化与反序列化。
769 7
|
XML JSON Java
go语言之JSON序列化
本文介绍了Go语言中的JSON序列化与反序列化,其操作与Java类似。需要注意的是,由于Go语言的包管理机制,变量和引入包的首字母需大写,以便其他包引用。示例代码展示了如何将`Student`结构体进行JSON序列化(返回字节数组,需转为字符串)及反序列化。此外,文章还说明了通过tag(如`json`和`xml`)指定序列化变量的重要性,以避免因包间访问限制导致反序列化失败或值为null的问题。
278 0
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
JSON JavaScript 前端开发
Go语言中json序列化的一个小坑,建议多留意一下
在Go语言开发中,JSON因其简洁和广泛的兼容性而常用于数据交换,但其在处理数字类型时存在精度问题。本文探讨了JSON序列化的一些局限性,并介绍了两种替代方案:Go特有的gob二进制协议,以及msgpack,两者都能有效解决类型保持和性能优化的问题。
662 7
|
12月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
469 19
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
504 3
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
2528 0