Для ответа ServiceStack.XmlServiceClient отсутствуют значения по умолчанию - PullRequest
0 голосов
/ 12 июня 2018

При использовании TestCaseSource в модульном тестировании для нескольких клиентов службы ServiceStack десериализация в строковом формате для XmlServiceClient не соответствует десериализации для JsonServiceClient или JsvServiceClient.Сериализация использует метод расширения SerializeAndFormat из класса ServiceStack.Text.TypeSerializer.

Использование функции OnDeserializing , по-видимому, не обеспечивает такую ​​же форматированную строку, так как в ней отсутствует стандартная строкаvalues.

Та же область JsConfig используется с excludeDefaultValues, установленным в false до вызова метода SerializeAndFormat.Результаты Json и Jsv совпадают, включая значения по умолчанию, но результат клиента службы xml не включает их.Объект, который не десериализован правильно, является свойством свойства объекта ответа и украшен этим атрибутом [Сериализуемый].

Ответ украшен [DataContract], [Сериализуемый], и объекты свойстваоба украшены [Serializable].

Как должны быть оформлены объекты, чтобы сериализованный ответ был согласованным для всех трех клиентов?

[DataContract]    
[Serializable]
public class CustomResponse : IMeta, IHasResponseStatus
{
    [DataMember(Order = 5)]
    public Dictionary<string, string> Meta { get; set; }
    [DataMember(Order = 100)]
    public DataView Result { get; set; }
    [DataMember(Order = 1)]
    public Summary Summary { get; protected set; }
    [DataMember(Order = 8)]
    public ResponseStatus ResponseStatus { get; set; }
}


[Serializable]
public class Summary : IResponseStatus
{
    public IEnumerable<HateoasLinks> Links { get; set; }
    [DataMember(Order = 5)]
    public string Message { get; protected set; }

    [DataMember(IsRequired = false)]
    public int? Offset { get; set; }
    [DataMember(IsRequired = false)]
    public int? Limit { get; set; }
    public string RequestFormat { get; private set; }

    [DataMember(IsRequired = false)]
    public int? Results { get; protected set; }

    public Parameters Params { get; protected set; }
}

[Serializable]
public class Parameters
{
    [DataMember(Order = 1)]
    public string Status { get; set; } = "OK";
    public string Sort { get; set; } = string.Empty;
    public string Filter { get; set; } = string.Empty;
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    [DataMember(EmitDefaultValue =true)]
    public int? Offset { get; set; } = 0;
    public int? Limit { get; set; } = 10;

    [OnDeserializing]
    void OnDeserializing(StreamingContext context)
    {
        if (!this.Limit.HasValue)
        {
            this.Limit = 10;
        }
        if (!this.Offset.HasValue)
        {
            this.Offset = 0;
        }
    }
}

приводит к:

 {
        summary: 
        {
        links: [],
        message: OK,
        params: 
        {
            status: OK,
            sort: "",
            filter: "",
        },
        isSuccess: False,
        status: 200,
        requestTime: 2014-03-14,
        currentPage: 1
    },
    result: 
    {
    }
}

но должны быть params:

{
    status: OK,
    sort: "",
    filter: "",
    offset: 0,
    limit: 10
}

1 Ответ

0 голосов
/ 13 июня 2018

ServiceStack использует .NET DataContract Serializer для XML, поэтому он ограничен поведением и функциями, которые он предоставляет.

JsConfig применяется только к текстовым сериализаторам, реализованным в ServiceStack, в основном предназначенным для JSON / JSV и частично используемым CSV.

...