我有各种丰富的数据结构(主要是树),我希望将其保存到磁盘,这意味着我不仅要将它们写入磁盘,而且还要保证数据已经完全写入并且能够存活下来掉电。
其他人似乎设计了将平面数据库表中的丰富数据结构编码为从父节点到子节点的查找表的方法。这有助于针对数据运行SQL查询,但我不需要:我只想保存并加载我的树。
显而易见的解决方案是将所有内容存储为数据库中的blob:单个条目可能包含长字符串。这是滥用数据库还是推荐的做法?另一种解决方案可能是使用XML数据库?我应该考虑使用数据库的替代方案吗?
最后,我是用F#做的,所以从.NET继承数据的交钥匙解决方案是理想的......
编辑:请注意格式化(例如序列化)无关紧要,因为我可以使用F#轻松转换格式。这是关于确认写入已经完成到非易失性存储(即磁盘盘片)并且写入数据的任何部分仍然保留在易失性存储(例如RAM高速缓存)中,以便我可以继续保护这些知识(例如,通过从磁盘中删除旧版本的数据)。
答案 0 :(得分:10)
.NET的FileStream类的一些构造函数采用类型为FileOptions的参数。 FileOptions的一个值是 WriteThrough ,“表示系统应该通过任何中间缓存写入并直接转到磁盘。”
这应该确保在您的写入操作(到新文件)返回时,数据被提交到磁盘,您可以安全地删除旧文件。
答案 1 :(得分:7)
这可以通过Serialization完成。
.NET Framework包含许多用于将数据序列化到磁盘的内置选项,包括使用二进制或基于XML的格式。 MSDN文档中提供了详细的How-To articles。
答案 2 :(得分:4)
为了做到这一点,您需要一个允许您参与Transaction
的资源(通常情况下,您会使用TransactionScope
。
如果包含一个数据库,大多数数据库都将参与Transaction
。磁盘操作也可以由Transaction
管理,但您必须执行一些specific work in order to utilize it in .NET。
另请注意,这仅适用于Windows Vista及更高版本。
如果你去数据库路线,那么你可以将树的序列化内容存储在blob(或文本中,具体取决于序列化机制)。
注意,您也可以使用SQL Server中的FILESTREAM
功能(我相信2008及以上版本)将文件存储在文件系统上和获得SQL Server中事务的好处
答案 3 :(得分:1)
之前我没有使用过来自F#的db4o,但它是以事务方式将CLR对象图持久化到磁盘。如果它适用于记录和受歧视的工会,它可能适合你。
编辑:我刚刚测试了db4o 8.0(.NET 4版本),它似乎能很好地处理记录类型和有区别的联合层次结构。
答案 4 :(得分:0)
尝试使用XMLSerializer(System.Xml.Serialization)。
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx
它可以根据属性自动保存复杂的数据结构,如果您愿意,可以使用属性来控制输出:
答案 5 :(得分:0)
稍微OT,因为OP不想要XML,但看到其他人提到了XML格式化程序...... 如果你想要文本持久性,SoapFormatter处理案例 (循环/对象 - 图形),默认的XML格式化程序没有 - 它的XML不像XMLFormatter那样可读,但它比二进制更易读:)