我们已经创建了一个类来包装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”类型序列化?
答案 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;
}
}