0

我通过 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

4

1 回答 1

-1

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

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

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

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

您可以在此处的集合和已知类型下找到一个示例。

于 2013-06-13T07:09:09.657 回答