C# 数据库中是否可以接受反序列化的文件引用?

C# 数据库中是否可以接受反序列化的文件引用?,c#,xml,database-design,fluent-nhibernate,xml-serialization,C#,Xml,Database Design,Fluent Nhibernate,Xml Serialization,我有一种情况,我需要存储一些数据,但这些数据不能…真正放入数据库表中。它有点太抽象了,我没有足够的知识把它拼凑成可以分解成表和列的形式。所讨论的对象是一个系统.Linq.Expressions.Expression 我发现了一种使用MetaLinq将此类文件序列化为xml的方法。它工作得很好,尽管它生成的xml过于繁杂,但我有点希望它能像表达式一样复杂。一个普通表达式的大小约为19KB 所以我的想法是对文件使用gzip压缩。这样做很好,它可以节省大约2KB的内存 那么,我的实际问题是:基本上使用

我有一种情况,我需要存储一些数据,但这些数据不能…真正放入数据库表中。它有点太抽象了,我没有足够的知识把它拼凑成可以分解成表和列的形式。所讨论的对象是一个
系统.Linq.Expressions.Expression

我发现了一种使用
MetaLinq
将此类文件序列化为xml的方法。它工作得很好,尽管它生成的xml过于繁杂,但我有点希望它能像表达式一样复杂。一个普通表达式的大小约为19KB

所以我的想法是对文件使用gzip压缩。这样做很好,它可以节省大约2KB的内存

那么,我的实际问题是:基本上使用表列引用文件名来反序列化对象是不好的做法还是“危险的”做法?就像我有一个表达式表,它有一个文件名,当调用该表达式时,它将执行gzip解压缩,反序列化它,并返回对象

这似乎是理想的解决方案,但它需要大量的文件I/O和各种压缩/压缩/序列化。我想知道我是否能得到更有经验的数据库管理员的意见。我正在使用
Fluent nHibernate
作为ORM映射器


我不是经验丰富的DBA,但我会将序列化数据存储在数据库中的BLOB字段中。如果您的数据所依赖的文件消失或相反,则数据库备份没有任何好处。我认为把所有这些都放在一起会使事情变得简单。blob工作正常,因为您存储的数据不需要查询。

取决于数据的大小

Sql现在有了表列的XML数据类型。因此,您可以反序列化对象,然后根据大小将整个对象再次插入列中

但是如果必须使用文件系统,我会在列中存储路径和文件名。 在程序app.config中,保留驱动器的根目录,如\\MyDrive或d:\

这样,如果信息移动,只要文件夹/文件结构保持不变,就可以更改应用程序配置

编辑:
如果您不需要“查看”数据库中的数据,那么除了NerdFury建议之外,您还可以使用二进制序列化程序。XML序列化至少使其可读

如何使用gzip压缩?或者我需要放弃压缩而将其存储为那样吗?@Ciel-不确定您使用的是什么来进行压缩,但只要您可以获得字节数组,就可以将其存储在BLOB中。我想你可以把它插入到Gzip表中。我知道.NET framework支持进行zip压缩的流,但我从未使用过它。但是基于它是一个流的事实,你可以很容易地从中得到一个字节数组。@Ciel,@NerdFury-我在.Net中使用了GZip stream类在Oracle数据库中存储二进制数据。第一个诀窍是包装流-因此您有一个备份MemoryStream,GZip流越过它,等等。诀窍是您必须
.Flush()
.Close()
GZip流才能让它写入流的结尾。完成此操作后,使用基础MemoryStream的
.ToArray()
方法获取BLOB列的压缩位。解压缩正相反地进行:)Oracle实际上允许用户通过引用表中的外部文件。AFAIK SQL Server没有实现这一点;但是您应该注意到,完全可以通过数据库将XML数据存储到表中。@rsenna:谢天谢地,自SQL Server 2008以来,MSSQL提供了一个类似Oracle的BFILE数据类型的系统。在MSSQL的例子中,它是通过一个。最棒的是,您可以通过T-SQL或直接通过SMB访问它,当您备份数据库时,它将得到备份。@Joshua:谢谢您提供的信息,我不知道。二进制序列化是我第一次尝试,事实上——但是,我没有成功地将结构序列化为二进制。如果我将其保存在XML中,我担心它的大小。是否认为19 kb对于xml字段太大?是的。从数据空间的角度来看,十个最大的表,而不是行,看起来最大的是每行1.05KB。好的,这有点帮助。我知道我需要保持像这样的东西的使用极其有限。