Jas*_*son 4 .net c# remoting binaryformatter
我正在使用RemotingServices.Marshal并Activator.GetObject在两台位于同一台计算机上的简单程序之间建立远程通道.
public class IpcInterface : MarshalByRefObject
{
public int number = -1;
public string text = "default";
public List<String> strings;
}
// A simplification
Run Code Online (Sandbox Code Playgroud)
我已经确认通道存在并且可以进行通信,因为两个程序都成功更改number并且text完全唯一的值(已确认).
所以我立即尝试做同样的事情strings.
在一个节目中,我打电话给strings.Add("1").我试着阅读strings第二个程序的内容.它是空的.更重要的是,伯爵是0.我不知道为什么strings继续有0对象,好像我从来没有添加它们.同样的事情发生了Stack<T>和Dictionary<T, K>,我只是不能将任何元素添加到它.为了确保通常没有引用奇怪的引用类型,我还尝试StringBuilder在IPC接口类中放置一个,并且在两个程序中成功维护"状态"以更改其值.
问题:为什么不添加字符串列表,解决方案是什么?
我希望有经验的人能马上发现这个问题.我尝试使用谷歌搜索类似的问题,但我没有得到任何有用的结果.令人惊讶的是,我只有一个很好的链接谷歌搜索" 调试.net远程透明代理 ".这也是我的第二个问题.如何调试透明代理对象?
问题是它List<T>本身不是一个MarshalByRefObject,而是一个可序列化的类.当您Add()在列表上调用方法时,您实际要做的是要求远程对象序列化其列表,在本地对其进行反序列化,然后在本地对象上调用该方法.您的更改永远不会传播回列表对象的远程实例.
您必须在IpcInterface类中提供操作列表的方法; 因为此类型继承自MarshalByRefObject,所以将在远程对象上调用方法而不是本地反序列化的实例.
即
public class IpcInterface : MarshalByRefObject {
public List<String> strings;
public void Add(string value) {
strings.Add(value);
}
}
Run Code Online (Sandbox Code Playgroud)
您可能还希望将其公开strings为只读集合,否则您会给人的印象是它可以直接操作(它不能).
| 归档时间: |
|
| 查看次数: |
1578 次 |
| 最近记录: |