序列化将对象转换为字节流,因此可以将其移出进程以保持持久性或发送到另一个进程。 反序列化是将字节流转换回对象的逆过程。
而且,与独立缓存不同,分布式缓存必须对对象进行序列化,以便将它们发送到缓存集群中的不同计算机。 但是,由提供的序列化机制 .NET framework 有两个主要问题:
1. 很慢: .NET 序列化使用反射在运行时检查类型信息。 与预编译代码相比,反射是一个极其缓慢的过程。
2. 非常笨重: .NET 序列化将完整的类名、区域性、程序集详细信息以及对其他实例的引用存储在成员变量中,所有这些都使得序列化字节流的大小是原始对象的许多倍。
由于分布式缓存用于提高您的应用程序性能和可扩展性,因此任何阻碍这一点的东西都变得非常关键。 而且,常规的 .NET 序列化是分布式缓存中的主要性能开销,因为在将数千个对象发送到分布式缓存以进行内存存储之前,每秒需要序列化数千个对象。 而且,这里的任何减速都会成为分布式缓存的减速。
另一个问题是庞大的序列化字节流消耗 2-3 倍的额外空间,并降低了分布式缓存的整体存储容量。 内存存储永远不会像磁盘存储那么大,这使得这对于分布式缓存来说是一个更加敏感的问题。
为了克服 .NET 序列化问题, NCache 已经实施了 紧凑的序列化框架. 在这个框架下, NCache 存储两字节类型 ID,而不是完全限定的程序集/类名称。 它通过仅序列化字段值并排除它们的类型细节来进一步减少序列化的字节流。 最后, NCache 紧凑序列化框架避免使用 .NET 反射,因为它通过直接访问实例对象的字段和属性来产生开销。
有两种使用方式 NCache 应用程序中的紧凑序列化。
- 让 NCache 在运行时生成紧凑序列化代码
- 自己实现一个 ICompactSerializable 接口
在这个博客中,我将只坚持第一种方法。 我将在单独的博客中讨论第二种方法。
让 NCache 在运行时生成紧凑序列化代码
确定您正在缓存的对象的类型,并将它们注册到 NCache 如图所示的紧凑序列化类型。 这就是你所要做的,并且 NCache 照顾其余的。
图 1:紧凑型序列化的寄存器类型 NCache
NCache 将注册的类型发送到 NCache 客户端在初始化时。 根据收到的类型, NCache 客户端生成运行时代码来序列化和反序列化每种类型。 运行时代码仅由 NCache 客户端在初始化时反复使用。 它比基于反射的序列化运行得快得多。
因此,使用 NCache 紧凑序列化您可以有效地利用您的分布式缓存内存并可以提高您的应用程序性能。
因此,请下载完整的 60 天试用版 NCache Enterprise 并亲自尝试一下。
嗨,
我们确实了解您已将上述 2 个选项放在一起。 您何时通过 IDE 使用紧凑序列化与实现接口。
-贾维德