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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
对象存储 OSS,20GB 3个月
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 开发时经常会遇到需要保存配置的情况,最常见的实现方式是将对象序列化成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,搭建一个在线教育视频课程分享网站。
相关文章
|
5月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
61 1
|
7月前
|
存储 JSON NoSQL
JSON 存入 Redis
【7月更文挑战第8天】
174 12
|
4月前
|
数据安全/隐私保护 Python
Zipfile学习笔记(二)::通过zipfile模块暴力破解加密的压缩文件
如何使用Python的zipfile模块生成密码表并尝试暴力破解加密的ZIP压缩文件。
78 1
Zipfile学习笔记(二)::通过zipfile模块暴力破解加密的压缩文件
|
5月前
|
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序列化)
|
4月前
|
存储 安全 算法
C#一分钟浅谈:数据加密与解密技术
【10月更文挑战第3天】在数字化时代,信息安全至关重要。数据加密作为保障信息不被未授权访问的有效手段,通过特定算法将明文转换为密文,确保即使数据被截获也难以解读。本文从基础概念入手,介绍C#中实现数据加密的方法,涵盖对称加密(如AES、DES)与非对称加密(如RSA),并通过具体示例代码演示如何使用`System.Security.Cryptography.Aes`类完成AES加密和解密过程。此外,还强调了密钥管理及安全策略的重要性。
115 4
|
4月前
|
JSON 缓存 NoSQL
Redis 在线查看序列化对象技术详解
Redis 在线查看序列化对象技术详解
63 2
|
3月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
5月前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
71 2
|
6月前
|
缓存 NoSQL 算法
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
|
6月前
|
Java C# 数据安全/隐私保护
如何 使 Java、C# md5 加密的值保持一致
如何 使 Java、C# md5 加密的值保持一致
91 0