【问题标题】:.NET Remoting, why isn't a list remotable?.NET Remoting,为什么列表不是可远程处理的?
【发布时间】:2012-11-21 04:43:07
【问题描述】:

我正在使用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&lt;T&gt;Dictionary&lt;T, K&gt; 也会发生同样的事情,我只是无法向其中添加任何元素。为了确保引用类型一般不会发生什么奇怪的事情,我还尝试在 IPC 接口类中放置一个StringBuilder,并且在两个程序中成功维护了“状态”,改变了它的值。

问题:为什么没有添加字符串列表,解决方法是什么?

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

  1. 所有对象都已正确实例化(没有 NullReferenceException;实际上没有异常)。

【问题讨论】:

  • 我遇到了完全相同的问题。一些复杂的对象按预期传递了它们的成员。但是一个不起作用的简单列表让我花费了几天的故障排除和挫败感,尤其是当MarshalByRefObject 应该创建一个透明代理时。除了它是如此透明,它实际上什么都不做。令人困惑的是,还有更复杂的集合(例如X509Certificate2Collection)可以正常工作。

标签: c# .net remoting binaryformatter


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 它对我不起作用,我得到:System.Runtime.Serialization.SerializationException: 'Soap Serializer does not support serializing Generic Types : System.Collections.Generic.List1[System.String]。' `
  • @Codey 如果您收到该错误,则表示您的远程处理通道正在使用SoapFormatter 而不是BinaryFormatter。如果您可以更改序列化方法,请尝试使用BinaryFormatter - 否则,由于SoapFormatter 不支持泛型类型,请尝试使用非泛型集合类型,例如StringCollection,而不是List&lt;string&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多