【问题标题】:What serialization format should we use to store serializaed objects in a SQL Server database我们应该使用什么序列化格式将序列化的对象存储在 SQL Server 数据库中
【发布时间】:2013-02-23 18:26:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • ASP.NET 有built-in caching support。你试过吗?
  • @Andomar - 站点所在的托管环境使用循环类型的配置进行负载平衡,并且主机不支持 AppFabric 或提供任何类型的内存缓存。在充分利用我们所拥有的东西方面,情况或多或少是开发人员与托管环境相比。

标签: asp.net sql-server caching serialization


【解决方案1】:

您提到的所有三个序列化选项(二进制、json 或 XML)都是序列化格式的有效选择。有many other serialization formats,但你提到的三个是最常见的。至于在三者之间进行选择,以下是一些注意事项:

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

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

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

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

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

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

【讨论】:

  • 但是您不能真正在 SSMS 中查询 JSON,而您可以查询 XML。尽管更大,我更喜欢 XML。
  • 好点,@Icarus。如果您想利用 SQL Server 中的所有高级 XML 查询功能,您应该序列化为 XML,尤其是如果您可以容忍额外的存储大小。
  • 感谢您的帮助。我们将考虑您的所有观点。最好的。
【解决方案2】:

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

【讨论】:

  • 感谢 Josh 关于二进制序列化的观点。如果您使用二进制序列化,您肯定必须考虑在应用程序的整个支持生命周期内进行维护
  • @JoeAlfano 是的,我坚持使用一些二进制序列化对象图,它们是持久实体。谈论一个痛苦......但我已经设法对它们进行版本更改,更改对象名称和类型并迁移它们......
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 2013-07-17
    • 2010-11-06
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多