我通过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个字符串和一个对象数组,然后我得到一个对象,这个方法被不同的位置调用,对象可以是不同的,如果我通过这个方法发送字符串或整数一切正常很好,但是当我尝试发送List时,事情就变坏了,并且该方法无法执行。现在我已经阅读了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:{{3没有预料到的。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。有关详细信息,请参阅InnerException。
内部异常:
{“Type'System.Collections.Generic.List`1 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]',数据合约名称为'ArrayOfstring:{{3不期望。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。“} < / p>
需要发送的对象是:如果所有内容都可能,如果不是所有正常的c#内容,例如Lists
答案 0 :(得分:-1)
当多态地使用集合类型代替其他集合或集合接口时,您不需要将集合类型添加到已知类型。例如,如果声明一个IEnumerable类型的数据成员并使用它来发送ArrayList的实例,则不需要将ArrayList添加到已知类型。
当您以多态方式使用集合代替非集合类型时,必须将它们添加到已知类型。例如,如果声明Object类型的数据成员并使用它来发送ArrayList的实例,请将ArrayList添加到已知类型。
这不允许您以多态方式序列化任何等效集合。例如,当您将ArrayList添加到已知类型列表时,即使它具有等效的数据协定,也不允许您分配Object of Class类。这与非集合类型的序列化上的常规已知类型行为没有什么不同,但是在集合的情况下理解它尤其重要,因为集合通常是等效的。
在序列化期间,对于给定的数据协定,在任何给定范围内只能知道一种类型,并且等效的集合都具有相同的数据协定。这意味着,在前面的示例中,您不能将ArrayList和Object of Array同时添加到同一范围内的已知类型。同样,这相当于非集合类型的已知类型行为,但了解集合尤为重要。 集合的内容也可能需要已知类型。例如,如果ArrayList实际上包含Type1和Type2的实例,则应将这两种类型添加到已知类型。
您可以在“收藏集”和“已知类型”下找到示例here。