将对象作为命令行arg传递

时间:2015-02-11 02:33:29

标签: c#

我有一个父应用程序,我希望它运行子应用程序并将一个复杂的对象传递给它,以便子进程执行。我已经在这里和那里搜索并提出了这些解决方案,这些解决方案对我不起作用,原因如下

使用Json.Net序列化/反序列化:这不起作用,因为我有抽象和接口,JSON.Net无法确定如何反序列化,强迫它这样做似乎很复杂。

使用IPC:我仍然需要将[Serializable]属性添加到我的应用程序中的每个类中,由于项目的大小,这实际上太难了。

Remoting:对于我想要执行的简单任务来说似乎太多了。

我需要什么?

子应用程序伪代码

static void Main(ComplexObject obj)
{
     //Here i got my object!.... (passed from parent by Process.Start's args)
}

1 个答案:

答案 0 :(得分:4)

我认为您已经找到了在您的问题中的进程之间共享对象的两种主要方法:序列化或远程访问。我将尝试解释为什么没有“更容易”的方法来实现它以及为什么这些解决方案有效。

想象一个复杂的对象:它包含对其他对象(可能是接口/基础/抽象类)的引用,资源句柄如文件和锁等等。所有这些都存在于父进程中,并且不能由子进程直接访问处理。这就是现代操作系统的工作原理。

解决这个问题的一种方法是找到所有碎片[1],将它们收集起来[2],以对另一个过程[3]有意义的方式将它们写下来并传递给孩子。无论您使用的是JSON,XML还是二进制数据文件,这基本上都是序列化的作用。

详细说明:

  1. 如果你有一个基类指针,你需要弄清楚对象的具体(真实)类来找到它的所有部分(成员),因为基数只代表对象的一部分。幸运的是,C#反射使这部分变得不那么困难了。

  2. 如果你的对象图中有一个循环(对象A引用引用A的B),那么你必须要小心收集对象的确切方式,否则你将陷入无限循环。当对象A有一个成员B来保存来自对象A的监听器/委托时,很容易发生这种循环。

  3. 文件,锁,数据库连接和其他资源通常由特定于流程的句柄(数字)引用,这对另一个流程毫无意义。

  4. 另一种方法是“远程”访问父进程中的对象。想象一下,子进程是客户端,父进程是服务器。您可以在父级中编写一个接口,将对象的方法公开给子级。这样,孩子可以在不实际拥有对象的情况下使用该对象。当对象具有无法共享的状态和资源时,此方法可能是适当的。

    我希望了解可能的解决方案必须处理什么,并帮助您选择适合您项目的策略。