C#实现文件数据库

简介:

如果你需要一个简单的磁盘文件索引数据库,这篇文章可以帮助你。

文件数据库描述:

  • 每个文档对象保存为一个独立文件,例如一篇博客。
  • 文件内容序列化支持XML或JSON。
  • 支持基本的CRUD操作。

文件数据库抽象类实现

View Code

XML文件数据库实现

复制代码
 1   /// <summary>
 2   /// XML文件数据库
 3   /// </summary>
 4   public class XmlDatabase : FileDatabase
 5   {
 6     /// <summary>
 7     /// XML文件数据库
 8     /// </summary>
 9     /// <param name="directory">数据库文件所在目录</param>
10     public XmlDatabase(string directory)
11       : base(directory)
12     {
13       FileExtension = @"xml";
14     }
15 
16     /// <summary>
17     /// 将指定的文档对象序列化至字符串
18     /// </summary>
19     /// <param name="value">指定的文档对象</param>
20     /// <returns>
21     /// 文档对象序列化后的字符串
22     /// </returns>
23     protected override string Serialize(object value)
24     {
25       if (value == null)
26         throw new ArgumentNullException("value");
27 
28       using (StringWriterWithEncoding sw = new StringWriterWithEncoding(Encoding.UTF8))
29       {
30         XmlSerializer serializer = new XmlSerializer(value.GetType());
31         serializer.Serialize(sw, value);
32         return sw.ToString();
33       }
34     }
35 
36     /// <summary>
37     /// 将字符串反序列化成文档对象
38     /// </summary>
39     /// <typeparam name="TDocument">文档类型</typeparam>
40     /// <param name="data">字符串</param>
41     /// <returns>
42     /// 文档对象
43     /// </returns>
44     protected override TDocument Deserialize<TDocument>(string data)
45     {
46       if (string.IsNullOrEmpty(data))
47         throw new ArgumentNullException("data");
48 
49       using (StringReader sr = new StringReader(data))
50       {
51         XmlSerializer serializer = new XmlSerializer(typeof(TDocument));
52         return (TDocument)serializer.Deserialize(sr);
53       }
54     }
55   }
复制代码

JSON文件数据库实现

复制代码
 1   /// <summary>
 2   /// JSON文件数据库
 3   /// </summary>
 4   public class JsonDatabase : FileDatabase
 5   {
 6     /// <summary>
 7     /// JSON文件数据库
 8     /// </summary>
 9     /// <param name="directory">数据库文件所在目录</param>
10     public JsonDatabase(string directory)
11       : base(directory)
12     {
13       FileExtension = @"json";
14     }
15 
16     /// <summary>
17     /// 将指定的文档对象序列化至字符串
18     /// </summary>
19     /// <param name="value">指定的文档对象</param>
20     /// <returns>
21     /// 文档对象序列化后的字符串
22     /// </returns>
23     protected override string Serialize(object value)
24     {
25       if (value == null)
26         throw new ArgumentNullException("value");
27 
28       return JsonConvert.SerializeObject(value, OutputIndent);
29     }
30 
31     /// <summary>
32     /// 将字符串反序列化成文档对象
33     /// </summary>
34     /// <typeparam name="TDocument">文档类型</typeparam>
35     /// <param name="data">字符串</param>
36     /// <returns>
37     /// 文档对象
38     /// </returns>
39     protected override TDocument Deserialize<TDocument>(string data)
40     {
41       if (string.IsNullOrEmpty(data))
42         throw new ArgumentNullException("data");
43 
44       return JsonConvert.DeserializeObject<TDocument>(data);
45     }
46   }
复制代码

Test Double

复制代码
 1   [Serializable]
 2   public class Cat
 3   {
 4     public Cat()
 5     {
 6       Id = ObjectId.NewObjectId().ToString();
 7     }
 8 
 9     public Cat(string id)
10     {
11       Id = id;
12     }
13 
14     public string Name { get; set; }
15     public int Legs { get; set; }
16 
17     public string Id { get; set; }
18 
19     public override string ToString()
20     {
21       return string.Format("DocumentId={0}, Name={1}, Legs={2}", Id, Name, Legs);
22     }
23   }
复制代码

使用举例

复制代码
 1   class Program
 2   {
 3     static void Main(string[] args)
 4     {
 5       TestJsonDatabase();
 6       TestXmlDatabase();
 7 
 8       Console.ReadKey();
 9     }
10 
11     private static void TestJsonDatabase()
12     {
13       JsonDatabase db = new JsonDatabase(@"C:\tmp");
14       db.OutputIndent = true;
15 
16       Cat origin = new Cat() { Name = "Garfield", Legs = 4 };
17       db.Save<Cat>(origin);
18 
19       db.Save<Cat>(origin.Id, origin);
20       db.Delete<Cat>(origin.Id);
21     }
22 
23     private static void TestXmlDatabase()
24     {
25       XmlDatabase db = new XmlDatabase(@"C:\tmp");
26       db.OutputIndent = true;
27 
28       Cat origin = new Cat() { Name = "Garfield", Legs = 4 };
29       db.Save<Cat>(origin);
30 
31       db.Save<Cat>(origin.Id, origin);
32       db.Delete<Cat>(origin.Id);
33     }
34   }
复制代码

 






本文转自匠心十年博客园博客,原文链接:http://www.cnblogs.com/gaochundong/archive/2013/04/24/csharp_file_database.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
数据库导入SQL文件:全面解析与操作指南
在数据库管理中,将SQL文件导入数据库是一个常见且重要的操作。无论是迁移数据、恢复备份,还是测试和开发环境搭建,掌握如何正确导入SQL文件都至关重要。本文将详细介绍数据库导入SQL文件的全过程,包括准备工作、操作步骤以及常见问题解决方案,旨在为数据库管理员和开发者提供全面的操作指南。一、准备工作在导
228 0
|
1月前
|
SQL 关系型数据库 MySQL
|
1月前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
30 2
|
2月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,急需恢复zxfg用户下的数据。 出现“system01.dbf需要更多的恢复来保持一致性”这个报错的原因可能是控制文件损坏、数据文件损坏,数据文件与控制文件的SCN不一致等。数据库恢复工程师对数据库文件进一步检测、分析后,发现sysaux01.dbf文件损坏,有坏块。 修复并启动数据库后仍然有许多查询报错,export和data pump工具使用报错。从数据库层面无法修复数据库。
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
|
1月前
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
131 1
|
1月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
40 1
|
1月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
178 10
|
1月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
|
1月前
|
Oracle 关系型数据库 数据库
oracle数据恢复—Oracle数据库文件损坏导致数据库打不开的数据恢复案例
打开oracle数据库时报错,报错信息:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。急需恢复zxfg用户下的数据。 出现上述报错的原因有:控制文件损坏、数据文件损坏、数据文件与控制文件的SCN不一致等。数据恢复工程师对数据库文件做进一步检测分析后发现sysaux01.dbf文件有坏块。修复sysaux01.dbf文件,启动数据库依然有许多查询报错。export和data pump工具无法使用,查询告警日志并分析报错,确认发生上述错误的原因就是sysaux01.dbf文件损坏。由于该文件损坏,从数据库层面无法修复数据库。由于system和用户表空间的数据文件是正常的,
|
1月前
|
SQL 缓存 大数据
C#高效处理大数据的批次处理,以及最好的数据库设计
C#高效处理大数据的批次处理,以及最好的数据库设计
60 0