在C#中使用映射内存文件来存储引用类型

时间:2010-04-27 15:31:01

标签: c# .net serialization memory-mapped-files

我需要尽快将字典存储到文件中。键和值都是对象,不保证标记为Serializable。另外,我更喜欢比序列化数千个对象更快的方法。所以我研究了.NET 4中的映射内存文件支持。但是,似乎MemoryMappedViewAccessor只允许存储结构而不是引用类型。

有没有办法存储文件引用类型使用的内存,并从该内存块重建对象(没有二进制序列化)?

3 个答案:

答案 0 :(得分:1)

我认为存储一块内存根本不可行,因为如果内存有引用类型,那么它将有指向其他内存块的指针,这些内存块可能在下次访问文件时不适用。这就是存在二进制序列化的原因:维护这些类型的引用。但是,如果你真的想要严密控制,我会使用System.IO.BinaryWriter和BinaryReader来完全控制以什么顺序写入文件的内容,同时最大限度地减少开销。

答案 1 :(得分:1)

内存映射文件与垃圾收集器根本不兼容。这就是为什么这种主要的操作系统功能需要很长时间才能得到.NET的支持。需要将引用类型序列化为MMF视图,即MemoryMappedViewStream,没办法解决。非托管代码中存在类似的限制,带指针的对象需要展平,因此指向对象在视图中也是可见的。

无论是将它们序列化为MMF还是文件都没有任何区别,文件系统缓存也是通过MMF实现的。只要写入的数据适合可用的可映射内存,文件写入就会非常。如果这是一个问题,那么请查看64位操作系统来解决该问题。

答案 2 :(得分:0)

这是二进制序列化的场景类型。你有什么特别的理由不想使用它吗?你确认它“太慢了”吗?当然,您可以编写自己的自定义序列化程序,并可能使其更有效地适用于您的特定方案,但是您必须继续维护它。值得努力吗?