5

我们正在开发一种定制的缓存解决方案,该解决方案将使用 SQL Server 数据库来存储缓存对象。应用程序的托管环境不提供“内存中”缓存,例如 memcached 或应用程序结构,因此我们必须使用 SQL Server 数据库。

虽然大多数缓存对象都是简单类型(int、string、dates 等),但我们还需要存储更复杂的类型,例如DataSets、DataTables、泛型集合和自定义类。

我对 .NET 的本机序列化和反序列化经验很少,但我认为我们必须将对象序列化为某种形式(二进制、xml、JSON 等)以将其存储在数据库中,然后在我们将其拉出时对其进行反序列化的数据库。我想对“某种形式”应该是什么有一些专家意见。

我们正在使用 JSON.NET 将数据序列化为 JSON 以用于各种 AJAX 请求。我最初的想法是将缓存的数据序列化为 JSON 以将其存储在数据库中。但是,我想就性能和数据完整性最好的方法获得一些意见。

4

3 回答 3

9

您提到的所有三个序列化选项(二进制、json 或 XML)都是序列化格式的有效选择。还有许多其他序列化格式,但您提到的三种是最常见的。至于在三者之间进行选择,以下是一些考虑因素:

  1. 如果您将数据以二进制格式存储在数据库中,那么如果您想通过使用 Sql Server Management Studio 或通过文本编辑器查看它,则人类无法阅读。如果您想手动细读数据,则必须编写某种反序列化工具。

  2. 二进制格式可能会导致序列化对象的大小最小,其次是 json,而 XML 最大。就实际大小差异而言,这将因您的数据结构而异。

  3. 就性能而言,二进制序列化可能比 json 或 XML 更快。但是,您必须使用您的数据对此进行基准测试,以查看差异是什么。

  4. 我认为所有三种格式类型都有出色的 .net 库和 BCL 支持,因此任何选择都应该是可行的。

因此,您的选择将取决于哪些因素对您最重要:CPU 利用率、磁盘存储空间、人类可读性和/或个人偏好。

我们已经广泛使用 json 来序列化我们的对象以存储在数据库中,使用JSON.Net,我们非常喜欢它。有时通过 SSMS 手动查看数据很方便,对于我们的数据,json 比 XML 更紧凑。

于 2013-02-23T18:53:44.410 回答
3

我不会重复乔的回答,因为他已经死了。我想补充一点,如果升级类,二进制序列化确实会增加复杂性。它是可管理的,但需要一些工作,并且需要您深入研究二进制序列化程序。与基于文本的方法一样,您可以使用其他选项迁移数据(例如,您可以在 XML 上运行 XSLT)

于 2013-02-23T18:57:59.890 回答
2

缓存必须小而快,而且我喜欢更具体地说明使用什么。

我建议protobuf-net和SO使用的一样,我用它,速度和大小真的很好。至少在我的测试中是更小更快。

我们出于同样的原因使用它(用于缓存),在我们尝试了其他序列化库之后,结果更快更小。现在在缓存模式中,您实际上不需要用眼睛看到里面有什么,因为这不是您可能需要更改某些内容的设置,因为您尚未修复该功能。

如果您想查看缓存对象上的内容,您可以创建一个简单的函数来打印它。

于 2013-02-23T19:54:20.493 回答