SOAP универсальный тип сериализации - PullRequest
3 голосов
/ 04 апреля 2011

Мы создали класс, чтобы обернуть полезную нагрузку ответа веб-службы общей информацией следующим образом.

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 ]

2 голосов
/ 04 апреля 2011

Сериализатор SOAP не поддерживает универсальные типы.Microsoft рекомендует использовать WCF http://msdn.microsoft.com/en-us/library/ms172342(v=VS.100).aspx. До WCF я помню, как они рекомендовали сериализатор XML.

1 голос
/ 05 апреля 2011

Хорошо, мы дошли до сути.

Оказывается, что XML Serializer может сериализовать универсальные типы сортировки. Как верно указывает neontapir, универсальные типы не полностью поддерживаются XML-сериализатором, но он все же может сериализовать универсальные типы, поскольку создает типы ItemResponseOfType [TheType], как я уже упоминал в своем вопросе.

Сериализатор XML просто не сериализует тип к универсальному типу.

Наша проблема заключалась в том, что свойство 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;
}
}
...