【问题标题】:Sending objects in WCF在 WCF 中发送对象
【发布时间】:2013-06-12 15:37:45
【问题描述】:

我正在通过 WCF 服务在另一台计算机上执行方法 这是我的代码的一个小例子:

对方法的调用: return pipeProxy.SystemRequest(InstanceName, MethodName, Parameters);

这些是方法和接口:

[ServiceContract]
    public interface IBlissRequest
    {
        [OperationContract]
        object SystemRequest(string InstanceName, string MethodName, object[] Parameters);
    }

    public class BlissRequest : IBlissRequest
    {
        public object SystemRequest(string InstanceName, string MethodName, object[] Parameters)
        {
            return System21.BlissProcessingUnit.BPU.RequestFromIBC(InstanceName, MethodName, Parameters); ;
        }
    }

如您所见,我发送了 2 个字符串和一个对象数组,然后我返回了一个对象,此方法由不同的位置调用,并且对象可以不同,如果我通过此方法发送字符串或整数,一切正常很好,但是当我尝试发送列表时,事情变糟了,该方法无法执行。现在我阅读了使用DataContractSerializer 的标准,我需要将其转换为XmlSerializer 才能使其工作。我找到了http://msdn.microsoft.com/en-us/library/ms733901.aspx,但我的示例无法正常工作。有人能指点我一个好的方向吗?

这是抛出的异常:

尝试序列化参数http://tempuri.org/:Parameters 时出错。 InnerException 消息是 'Type 'System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]',数据合同名称为 'ArrayOfstring:http://schemas.microsoft.com/2003/10/Serialization/Arrays ' 不是预期的。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。有关详细信息,请参阅 InnerException。

内部异常:

{"Type 'System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' 数据合约名称为 'ArrayOfstring:http://schemas.microsoft.com/2003/10/Serialization/Arrays ' 不是预期的。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。"}

需要发送的对象是:如果有可能的话,如果不是所有正常的 c# 东西,比如Lists

【问题讨论】:

  • 你需要在客户端序列化你的列表,然后在服务器上反序列化它
  • @Jonesy 但在运行时我不知道正在发送或接收什么,所以我不知道它是列表还是字符串
  • 对不起,我误会了
  • "...事情变糟了" - 您是否收到异常或错误消息?会发生什么 - 什么都没有?
  • @Tim 我已经用异常详细信息更新了我的帖子

标签: c# wcf


【解决方案1】:

当以多态方式代替其他集合或集合接口使用时,您不需要将集合类型添加到已知类型。例如,如果您声明一个 IEnumerable 类型的数据成员并使用它来发送 ArrayList 的实例,则无需将 ArrayList 添加到已知类型。

当您以多态方式使用集合代替非集合类型时,必须将它们添加到已知类型。例如,如果您声明一个 Object 类型的数据成员并使用它来发送 ArrayList 的实例,则将 ArrayList 添加到已知类型。

这不允许您以多态方式序列化任何等效集合。例如,当您将 ArrayList 添加到已知类型列表时,这不允许您分配 Object 类的 Array,即使它具有等效的数据协定。这与非集合类型序列化的常规已知类型行为没有什么不同,但在集合的情况下理解这一点尤其重要,因为集合等价是很常见的。

在序列化期间,对于给定的数据协定,在任何给定范围内只能知道一种类型,并且等效集合都具有相同的数据协定。这意味着,在前面的示例中,您不能同时将 ArrayList 和 Array of Object 添加到同一范围内的已知类型。同样,这等效于非集合类型的已知类型行为,但理解集合尤其重要。 集合的内容也可能需要已知类型。例如,如果 ArrayList 实际上包含 Type1 和 Type2 的实例,则这两种类型都应添加到已知类型中。

您可以在集合和已知类型下找到一个示例 here

【讨论】:

  • 我不完全理解你的解释,我还是c#这个角落的初学者。这是我描述的可能吗?你能告诉我我发布的代码上的例子吗?
猜你喜欢
  • 2015-03-11
  • 2011-02-13
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多