SOAP泛型类型序列化

时间:2011-04-04 14:28:41

标签: c# asp.net web-services serialization soap

我们已经创建了一个类来包装Web服务响应的有效负载,其中包含以下常见信息。

public class ItemResponse<T> : Response
    {
    /// <summary>
    /// constructor to set private properties Item and Status
    /// </summary>
    /// <param name="item"></param>
    /// <param name="status"></param>
    public ItemResponse(T item, ResponseStatusEnum status) : base(status)
    {
        _item = item;
    }

    public ItemResponse()
    {
    }


    public ItemResponse(ResponseStatusEnum status, System.Collections.Generic.List<ResponseError> errors) : base(status, errors)
    {
    }
    private T _item;

    public T Item
    {
        get
        {
            return _item;
        }
    }


}

基类“Response”只保存错误信息和响应的状态。 wsdl清楚地将此响应的定义显示为ItemResponseOfType [TypeName],但定义中缺少项类型信息。

我们尝试添加

[XmlInclude(typeof(TypeName))]

但无济于事。我们可以做些什么来让SOAP序列化器知道我们想要“Item”类型序列化?

2 个答案:

答案 0 :(得分:2)

SOAP序列化程序不支持泛型类型。 Microsoft建议使用WCF http://msdn.microsoft.com/en-us/library/ms172342(v=VS.100).aspx。在WCF之前,我记得他们推荐XML序列化程序。

答案 1 :(得分:1)

好的,我们已经到底了。

事实证明,XML Serializer可以序列化排序的泛型类型。正如neontapir正确指出的那样,XML Serializer并不完全支持泛型类型,但它仍然可以序列化泛型类型,因为它创建了我在问题中提到的ItemResponseOfType [TheType]的类型。

XML Serializer不会将类型序列化为泛型类型。

我们的问题只是属性Item是只读的,因此SOAP错过了Item属性。我们只需要将该属性设置为可设置为修复如下

public class ItemResponse<T> : Response
{
/// <summary>
/// constructor to set private properties Item and Status
/// </summary>
/// <param name="item"></param>
/// <param name="status"></param>
public ItemResponse(T item, ResponseStatusEnum status) : base(status)
{
    Item = item;
}

public ItemResponse()
{
}


public ItemResponse(ResponseStatusEnum status, System.Collections.Generic.List<ResponseError> errors) : base(status, errors)
{
}

public T Item
{
     get; set;
}
}
相关问题