При использовании 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
}