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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
对象存储 OSS,20GB 3个月
简介: 开发时经常会遇到需要保存配置的情况,最常见的实现方式是将对象序列化成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搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
3月前
|
存储 JSON NoSQL
JSON 存入 Redis
【7月更文挑战第8天】
79 12
|
8天前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
11天前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
33 2
|
2月前
|
Java C# 数据安全/隐私保护
如何 使 Java、C# md5 加密的值保持一致
如何 使 Java、C# md5 加密的值保持一致
27 0
|
2月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
4月前
|
NoSQL Redis
redis使用jackson序列化数据配置文件
redis使用jackson序列化数据配置文件
105 5
|
4月前
|
JSON 数据格式
一篇文章讲明白Json串压缩转义
一篇文章讲明白Json串压缩转义
43 3
|
3月前
|
JSON NoSQL Java
Redis18的Java客户端-StringRedisTemplate,序列化存在的问题,使用StringRedisTemplate解决序列化的方法
Redis18的Java客户端-StringRedisTemplate,序列化存在的问题,使用StringRedisTemplate解决序列化的方法
|
4月前
|
存储 JSON NoSQL
深入解析RedisJSON:在Redis中直接处理JSON数据
深入解析RedisJSON:在Redis中直接处理JSON数据
|
4月前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密
60 0
下一篇
无影云桌面