.NET Remoting,为什么不是一个可远程列表?

时间:2012-11-21 04:43:08

标签: c# .net remoting binaryformatter

我正在使用RemotingServices.MarshalActivator.GetObject在两台位于同一台计算机上的简单程序之间建立远程通道。

public class IpcInterface : MarshalByRefObject
{
    public int number = -1;
    public string text = "default";
    public List<String> strings;
}
// A simplification

我已确认该频道存在且可以进行通信,因为两个节目都成功将numbertext更改为完全唯一的值(已确认)。

所以我立即尝试为strings做同样的事情。

在一个程序中,我打电话给strings.Add("1")。我尝试在第二个程序中阅读strings的内容。它是空的。更重要的是,计数是0。我不知道为什么strings继续拥有0个对象,就像我从未添加过它们一样。同样的事情发生在Stack<T>Dictionary<T, K>上,我无法添加任何元素。为了确保通常没有引用奇怪的引用类型,我还尝试在IPC接口类中放置StringBuilder,并且在两个程序中成功维护“状态”以更改其值。 / p>

问题:为什么不添加字符串列表,解决方案是什么?

我希望有经验的人能马上发现这个问题。我尝试使用谷歌搜索类似的问题,但我没有得到任何有用的结果。令人惊讶的是,我只有一个很好的链接谷歌搜索“调试.net远程透明代理”。这也是我的第二个问题。如何调试透明代理对象?

  1. 所有对象都被正确实例化(没有NullReferenceException;实际上,没有例外)。

1 个答案:

答案 0 :(得分:9)

问题是List<T>本身不是MarshalByRefObject,而是一个可序列化的类。当您在列表上调用Add()方法时,您实际要做的是要求远程对象序列化其列表,在本地对其进行反序列化,然后在本地对象上调用该方法。您的更改永远不会传播回列表对象的远程实例。

您必须在IpcInterface类中提供操作列表的方法;因为此类型继承自MarshalByRefObject,所以将在远程对象而不是本地反序列化的实例上调用这些方法。

public class IpcInterface : MarshalByRefObject {
    public List<String> strings;

    public void Add(string value) {
        strings.Add(value);
    }
}

您可能还希望将strings公开为只读集合,否则您会给人的印象是它可以直接操作(它不能)。