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

使用C#中的映射内存文件存储引用类型,c#,.net,serialization,memory-mapped-files,C#,.net,Serialization,Memory Mapped Files,我需要尽可能快地将字典存储到文件中。键和值都是对象,不能保证标记为可序列化。此外,我更喜欢一种比序列化数千个对象更快的方法。所以我研究了.NET4中的映射内存文件支持。然而,MemoryMappedViewAccessor似乎只允许存储结构而不允许存储引用类型 有没有一种方法可以存储文件引用类型所使用的内存,并从该内存块重建对象(无二进制序列化)?这就是二进制序列化设计的场景类型。你不想使用它有什么具体的原因吗?你有没有证实它“太慢了”?当然,您可以编写自己的自定义序列化程序,并可能使其在特定场

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


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

这就是二进制序列化设计的场景类型。你不想使用它有什么具体的原因吗?你有没有证实它“太慢了”?当然,您可以编写自己的自定义序列化程序,并可能使其在特定场景中更有效,但随后您必须继续维护它。这值得付出努力吗?

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

内存映射文件与垃圾收集器基本不兼容。这就是为什么这样一个主要的操作系统功能花了这么长时间才得到.NET的支持。引用类型需要序列化到MMF视图MemoryMappedViewStream,这是不可能的。非托管代码中也存在类似的限制,带有指针的对象需要展平,以便指向的对象在视图中也可见


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

在运行32位工作站的dev工作站上,序列化一个50兆的字典大约需要70秒。所以我猜:是的,它很慢,但是你想定义“太慢”