gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:18:30 30 4
gpt4 key购买 nike

我需要将一个 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 共享这种对象?

=> 要避免这些序列化/反序列化操作,共享对象应该有什么特征?

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

谢谢

最佳答案

您不能使用 C# 直接在内存映射文件中分配对象(保持安全代码)。所以这意味着你需要有某种序列化来在两个应用程序之间传输数据。

广泛的选择:

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

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

关于c# - 是否可以避免序列化/反序列化并与内存映射文件 (MMF) 共享大内存对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27026095/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com