繁体   English   中英

是否可以避免序列化/反序列化并与内存映射文件(MMF)共享大内存对象?

[英]Is it possible to avoid serialization/deserialization and to share big memory object with Memory-mapped files (MMF)?

我需要将C#内存对象从一个进程传递到另一个进程(IPC)

我刚刚尝试在文件中序列化此对象,然后在我的第二个进程中使用二进制序列化( BinaryFormatter )对其进行反序列化,以获得良好的性能。

不幸的是,性能达不到我的预期。 由于我的对象有很多信息,序列化和反序列化需要花费太多时间(我的对象的序列化在我的硬盘上需要超过1MB)。

我听说过

内存映射文件(MMF)

当进程之间共享的对象很简单时,这似乎是IPC最快的方​​法之一。 在C#中两个进程之间进行通信的最快和最简单的方法是什么?

我的对象只是这样的简单嵌套结构:

public struct Library
{
    public Book[] books;
    public string name;
}

public struct Book
{
    public decimal price;
    public string title;
    public string author;
}

=> 是否可以避免序列化/反序列化并与MMF共享此类对象?

=> 共享对象的特征应该是什么,以避免这些sérialization/ deserialization操作?

还有一个约束:我的第一个进程是C#64位进程,我的第二个进程是32位进程。

谢谢

您不能使用C#直接在Memory Mapped File中分配对象(保留在安全代码中)。 因此,这意味着您需要进行某种序列化以在两个应用程序之间传输数据。

广泛的选择:

  1. 将所有原始数据(或多或少作为字节数组)保存在MMF中,并使用C#包装器按需读取/写入数据。
  2. 手动查找更快的序列化/构建
  3. 使用某种形式的更改跟踪并仅在应用程序之间发送差异。

我个人会选择3,因为如果适用于特定问题,它将提供最可靠和类型安全的收益。

是否可以避免序列化/反序列化并与MMF共享此类对象?

使用var/foreach语句迭代Book[]项的元素,并通过创建视图访问器将它们写入MMF。

示例:

 var BookWriter = (whatever you named Book[]);


Foreach(var in BookWriter)

{

(Using MMF...))
    {  
        (Using Accessor.MMF...))
        {      
        Accessor.write(point1, Bookwriter[0]);
        Accessor.write(point2, Bookwriter[1]);
         }//dispose ViewAcessor.
    }// disposes the MMF handle...`

}// Finished iterating Book[i]...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM