NCache 和 AppFabric 等产品也在将对象存储到进程外缓存服务之前执行序列化。所以你仍然会受到序列化的影响,而且你会因为进程外(甚至可能通过网络)访问缓存服务中的序列化对象而进一步减慢速度。
在您的类上实现ICloneable以执行手动调整的深度复制将避免反射并且将优于二进制序列化,但如果您的 DTO 非常复杂,这可能不切实际。
更新以提供细节:
AppFabric 使用 NetDataContractSerializer 进行序列化(如此处所述)。NetDataContractSerializer 可能比 BinaryFormatter 快一点,但它的性能通常在同一个范围内:http: //blogs.msdn.com/b/youssefm/archive/2009/07/10/comparing-the-performance-of -net-serializers.aspx
NCache 推出了他们自己的序列化程序,称为“紧凑序列化”。您需要在 DTO 类上实现他们的 ICompactSerializable 接口并手动读/写所有成员,或者让他们的客户端库检查您的类,然后在运行时发出自己的序列化代码来为您完成这项工作(这是一个当您的应用程序启动时,他们必须反映您的课程并发出自己的 MSIL)。我没有关于它们性能的数据,但可以肯定的是,它比执行反射的序列化程序 (BinaryFormatter/DataContractSerializer) 更快,并且可能与 protobuf、MessagePack 和其他避免过度反射的序列化程序处于同一性能领域。更多细节在这里。
(我在一家公司(ScaleOut Software)工作,该公司与 NCache 位于同一空间,所以我可能应该更多地了解他们是如何做事的。ScaleOut 让您可以插入任何您想要的序列化程序——我们通常推荐Protobuf-net或MessagePack,因为它们通常被认为是 .NET 序列化性能的卫冕冠军——如果您决定使用序列化程序制作深层副本,请务必仔细查看这两个。)