如何将List <object>传递给WCF </object>

时间:2010-07-20 10:07:03

标签: c#

我已经配置了我的服务引用并将我的集合设置为Generic.List。

当我用字符串或int填充List<Objects>时,它可以正常工作。但是当我用List<String>填充它时,它会产生运行时错误while trying to serialize parameter

那么有没有办法将包含多个List<Objects>的{​​{1}}传递给WCF?

6 个答案:

答案 0 :(得分:5)

在数据合约上使用KnownType属性。见Data Contract Known Types

[KnownType(typeof(List<string>))]
[DataContract]
public class YourClass
{
    [DataMember]
    public List<object> YourList { get; set; }
}

答案 1 :(得分:4)

使用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.

答案 2 :(得分:1)

我认为你需要传递一个对象数组,而不是尝试使用泛型。 Web服务是平台无关的,因此需要被任何客户端使用 - 如果.NET 1.x应用程序试图访问该服务该怎么办?

答案 3 :(得分:1)

我在WCF服务中传递通用列表时遇到了同样的问题。 原因是默认情况下DataContractSerializer用于序列化数据。 使用XmlSerializer解决了我的问题。

更多信息:http://msdn.microsoft.com/en-us/library/ms733901.aspx

答案 4 :(得分:0)

您是否尝试将列表作为“字符串列表列表”而不是“对象列表”传递?当您将列表作为对象传递时,SOAP可能缺少序列化信息....

List<List<String>> allYourStringLists = new List<List<String>>();
List<String> firstStringList = new List<String> { "a", "b" };

allYourStringLists.add(firstStringList);

然后传递“allYourStringLists”对象

答案 5 :(得分:0)

嗯... 所以你想传递一个字符串列表。正确的吗?

为什么不这样做?

List<List<string>>