我已经配置了Service Reference并将我的集合设置为Generic.List。
当我用字符串或整数填充List<Objects>
时,它可以正常工作。但是,当我用List<String>
填充它时,会给出运行时错误while trying to serialize parameter
那么有没有办法将包含多个List<Objects>
的List<String>
传递给WCF?
最佳答案
使用XmlSerializer类:
Windows Communication Foundation(WCF)可以使用两种不同的序列化技术将应用程序中的数据转换为在客户端和服务之间传输的XML,此过程称为序列化。
DataContractSerializer作为默认值:
默认情况下,WCF使用DataContractSerializer类来序列化数据类型。该序列化器支持以下类型:
基本类型(例如,整数,字符串和字节数组),以及某些特殊类型(例如XmlElement和DateTime)被视为基本类型。
数据协定类型(标记有DataContractAttribute属性的类型)。
用SerializableAttribute属性标记的类型,包括实现ISerializable接口的类型。
实现IXmlSerializable接口的类型。
许多常见的收集类型,其中包括许多通用的收集类型。
许多.NET Framework类型都属于后两类,因此可以序列化。可序列化类型的数组也可序列化。有关完整列表,请参阅在服务合同中指定数据传输。
建议将DataContractSerializer与数据协定类型一起使用,以编写新的WCF服务。有关更多信息,请参见使用数据协定。
何时使用XmlSerializer类:
WCF还支持XmlSerializer类。 XmlSerializer类不是WCF唯一的。它与ASP.NET Web服务使用的序列化引擎相同。 XmlSerializer类比DataContractSerializer类支持的类型集要窄得多,但是可以对生成的XML进行更多控制,并支持更多的XML Schema定义语言(XSD)标准。它还不需要可序列化类型的任何声明性属性。有关更多信息,请参见.NET Framework文档中的XML序列化主题。 XmlSerializer类不支持数据协定类型。
在Visual Studio中使用Svcutil.exe或“添加服务引用”功能来生成第三方服务的客户端代码或访问第三方架构时,会自动为您选择合适的序列化程序。如果该架构与DataContractSerializer不兼容,则选择XmlSerializer。
手动切换到XmlSerializer:
有时,您可能必须手动切换到XmlSerializer。例如,在以下情况下,会发生这种情况:
将应用程序从ASP.NET Web服务迁移到WCF时,您可能想重用与XmlSerializer兼容的现有类型,而不是创建新的数据协定类型。
当对消息中出现的XML的精确控制很重要,但是Web服务描述语言(WSDL)文档不可用时,例如,当创建的服务类型必须符合某些标准化的,已发布的,但不符合要求的架构时,与DataContractSerializer兼容。
创建遵循旧版SOAP编码标准的服务时。
在这些情况下,可以通过将XmlSerializerFormatAttribute属性应用于服务来手动切换到XmlSerializer类,如以下代码所示。
[ServiceContract]
[XmlSerializerFormat]
public class BankingService
{
[OperationContract]
public void ProcessTransaction(BankingTransaction bt)
{
// Code not shown.
}
}
//BankingTransaction is not a data contract class,
//but is an XmlSerializer-compatible class instead.
public class BankingTransaction
{
[XmlAttribute]
public string Operation;
[XmlElement]
public Account fromAccount;
[XmlElement]
public Account toAccount;
[XmlElement]
public int amount;
}
//Notice that the Account class must also be XmlSerializer-compatible.
关于c# - 如何将List <Object>传递给WCF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3288883/