Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SOAP泛型类型序列化_C#_Asp.net_Web Services_Serialization_Soap - Fatal编程技术网

C# SOAP泛型类型序列化

C# SOAP泛型类型序列化,c#,asp.net,web-services,serialization,soap,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> ///

我们创建了一个类,用以下公共信息包装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;
        }
    }


}

但是没有用。我们可以做些什么让SOAP序列化程序知道我们想要序列化“Item”类型?

SOAP序列化程序不支持泛型类型。Microsoft建议使用WCF。在WCF之前,我记得他们推荐了XML序列化程序。

好的,我们已经了解了这一点

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

XML序列化程序不会将类型反序列化为泛型类型

我们的问题只是属性项是只读的,因此SOAP遗漏了该项属性。我们只需要将该属性设置为公共的,如下所示进行修复

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;
}
}
公共类ItemResponse:Response
{
/// 
///构造函数来设置私有属性项和状态
/// 
/// 
/// 
public ItemResponse(T项,ResponseStatusEnum状态):基本(状态)
{
项目=项目;
}
公共项目响应()
{
}
public ItemResponse(ResponseStatusEnum状态,System.Collections.Generic.List错误):基本(状态,错误)
{
}
公共交通项目
{
获得;设置;
}
}

Hmmm,这是一种痛苦。产生的WSDL似乎表明它确实支持它,尽管web服务方法的响应类型被定义为ItemResponseOfType[TypeName],其中[TypeName]是有效负载类型。它只是没有用Types属性充实响应。Microsoft在引入2.0和泛型后停止了SOAP序列化程序的开发。在没有WCF的情况下,是否可以编写一个自定义序列化程序,只为“Item”类型的序列化程序进行链接?当然可以,或者您可以对对象使用XML序列化程序,我怀疑他使用的是SOAP格式化程序(没有SOAP序列化程序)。我想他只是在使用XML序列化程序。你的问题不在于“SOAP”-而是XML序列化程序的工作方式。是的,我认为这是正确的。XML序列化程序创建“虚拟”程序集的方式意味着它需要能够设置实例属性,这导致了问题。
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;
}
}