c# – 是否可以避免序列化/反序列化并与内存映射文件(MMF)共享大内存对象?
作者:互联网
我需要将C#内存对象从一个进程传递到另一个进程(IPC)
我刚刚尝试在文件中序列化此对象,然后在我的第二个进程中使用二进制序列化(BinaryFormatter)对其进行反序列化,以获得良好的性能.
不幸的是,性能达不到我的预期.
由于我的对象有很多信息,序列化和反序列化需要花费太多时间(我的对象的序列化在我的硬盘上需要超过1MB).
我听说过
Memory-mapped files (MMF)
当进程之间共享的对象很简单时,这似乎是IPC最快的方法之一.
What is the fastest and easiest way to communicate between 2 processes in 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中分配对象(保留在安全代码中).因此,这意味着您需要进行某种序列化以在两个应用程序之间传输数据.
广泛的选择:
>将所有原始数据(或多或少作为字节数组)保存在MMF中,并使用C#包装器按需读取/写入数据.
>手动查找更快的序列化/构建
>使用某种形式的更改跟踪,并仅在应用程序之间发送差异.
我个人会选择3,因为如果适用于特定问题,它将提供最可靠和类型安全的收益.
标签:c,struct,32bit-64bit,ipc,memory-mapped-files 来源: https://codeday.me/bug/20190624/1276565.html