Для ответа ServiceStack.XmlServiceClient отсутствуют значения по умолчанию
При использовании TestCaseSource в модульном тестировании для нескольких клиентов службы ServiceStack десериализация в строковый формат для XmlServiceClient не соответствует десериализации для JsonServiceClient или JsvServiceClient. Сериализация использует метод расширения SerializeAndFormat из класса ServiceStack.Text.TypeSerializer.
Использование функциональности OnDeserializing, по- видимому, не обеспечивает такую же форматированную строку, поскольку в ней отсутствуют значения по умолчанию.
Та же область JsConfig используется с excludeDefaultValues, установленным в false перед вызовом метода SerializeAndFormat. Результаты Json и Jsv совпадают, включая значения по умолчанию, но результат клиента службы xml не включает их. Объект, который не десериализован правильно, является свойством свойства объекта ответа и имеет этот атрибут [Serializable].
Ответ украшен [DataContract], [Serializable], а объекты свойств оба украшены [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 ответ
ServiceStack использует.NET DataContract Serializer for XML, поэтому он ограничен поведением и функциями, которые он предоставляет.
JsConfig применяется только к текстовым сериализаторам, реализованным в ServiceStack, в первую очередь предназначенным для JSON/JSV и частично используемым CSV.