我们正在开发一种定制的缓存解决方案,该解决方案将使用SQL Server数据库来存储缓存的对象。应用程序的托管环境不提供“内存中”缓存,例如memcached或app fabric,因此我们必须使用SQL Server数据库。
虽然大多数缓存对象都是简单类型(int,string,date等),但我们还需要存储更复杂的类型,例如DataSet
s,DataTable
s,泛型集合和自定义类。
我对.NET的本机序列化和反序列化的经验很少,但我想我们必须将对象序列化为某种形式(二进制,xml,JSON等)以将其存储在数据库中,然后在我们将其反序列化时把它拉出数据库。我想对“某种形式”应该是什么有一些专家意见。
我们正在使用JSON.NET将数据序列化为JSON以用于各种AJAX请求。我最初的想法是将缓存的数据序列化为JSON以将其存储在数据库中。但是,我想就性能和数据完整性最佳方面提出一些意见。
答案 0 :(得分:9)
您提到的所有三个序列化选项(二进制,json或XML)都是序列化格式的有效选择。有many other serialization formats,但你提到的三个是最常见的。至于在三者之间进行选择,以下是一些注意事项:
如果您将数据以二进制格式存储在数据库中,那么如果您想通过使用Sql Server Management Studio或文本编辑器查看数据,那么它就不是人类可读的。如果您想手动浏览数据,则必须编写某种反序列化工具。
二进制格式可能会导致序列化对象的大小最小,其次是json,XML是最大的。就实际大小差异而言,这将随您的数据结构而变化。
就性能而言,二进制序列化可能比json或XML更快。但是,您必须根据数据对此进行基准测试,以了解其差异。
我认为对所有这三种格式类型都有优秀的.net库和BCL支持,因此任何选择都应该是可行的。
因此,您的选择将取决于哪些因素对您最重要:CPU利用率,磁盘存储空间,人类可读性和/或个人偏好。
我们已经广泛使用json来序列化我们的对象以便在数据库中存储,使用JSON.Net并且我们非常喜欢它。有时通过SSMS手动查看数据很方便,json比XML更紧凑。
答案 1 :(得分:3)
我不会重复乔的回答,因为他已经死了。我想补充说,如果升级类,二进制序列化会增加复杂性。它是可管理的,但需要一些工作,并要求您深入研究二进制序列化器。与基于文本的方法一样,您可以使用其他选项迁移数据(例如,您可以在其上运行XSLT的XML)
答案 2 :(得分:2)
缓存必须小而快,我希望更具体地说明使用什么。
我建议protobuf-net与SO使用相同,我使用它,速度和大小一起非常好。至少我的测试是更小更快。
我们使用它的原因相同(对于缓存),在我们尝试其他序列化库之后,结果越快越小。现在在缓存模式中,你实际上不需要用眼睛看到什么是内部因为不是你可能需要更改某些东西的设置,因为你还没有修复它的功能。
如果您想查看缓存对象上的内容,可以创建一个打印它的简单函数。