【发布时间】:2014-11-19 20:11:40
【问题描述】:
我需要将一个 C# 内存对象从一个进程传递到另一个 (IPC)
我刚刚尝试在文件中序列化这个对象,然后在我的第二个进程中使用二进制序列化 (BinaryFormatter) 反序列化它,以获得良好的性能。
很遗憾,性能没有达到我的预期。 由于我的对象有很多信息,序列化和反序列化花费的时间太多(我的对象的序列化在我的硬盘驱动器上占用了 1MB 以上)。
听说过
内存映射文件 (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 位进程。
谢谢
【问题讨论】:
-
你需要衡量你大部分时间都在哪里度过。请注意,磁盘 I/O 默认情况下是缓存的,因此很有可能大部分时间花在序列化而不是 I/O 本身上(因为无论如何它都将在内存中操作,除非您的系统承受沉重的内存压力)。
-
@AlexeiLevenkov:我同意你的看法。大部分时间花在序列化/反序列化上,而不是 I/O 本身
-
你是如何序列化对象的?
-
@SriramSakthivel:使用 BinaryFormatter
-
Check this out 尝试使用 Marshal 类。
标签: c# struct ipc 32bit-64bit memory-mapped-files