nunit - ServiceStack.XmlServiceClient 响应缺少默认值
问题描述
在多个 ServiceStack 服务客户端的单元测试中使用 TestCaseSource 时,反序列化为 XmlServiceClient 的字符串格式与反序列化的 JsonServiceClient 或 JsvServiceClient 不匹配。序列化使用来自 ServiceStack.Text.TypeSerializer 类的 SerializeAndFormat 扩展方法。
使用OnDeserializing功能似乎没有提供相同的格式化字符串,因为它缺少默认值。
在调用 SerializeAndFormat 方法之前,将 excludeDefaultValues 设置为 false 使用相同的 JsConfig 范围。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:
{
}
}
但应该是参数:
{
status: OK,
sort: "",
filter: "",
offset: 0,
limit: 10
}
解决方案
ServiceStack 使用 .NET DataContract Serializer for XML,因此它仅限于它提供的行为和功能。
JsConfig 仅适用于 ServiceStack 实现的文本序列化器,主要为 JSON/JSV 设计,部分由 CSV 使用。
推荐阅读
- python - 无法在 RasberryPi Python 上安装 Open-CV
- c# - 如何在 WCF 中打开多个 http 端点?
- reactjs - 如何在 framer-motion styled-component 上定义道具?(PSA)
- java - 在 Android Studio 的 VideoCapture 中检查输入
- web-scraping - 搜索引擎如何在不被阻止的情况下抓取 Instagram 关注者?
- sql - 如何在 SQL Server 和节点中上传图像和其他数据?
- python - 在项目内运行“诗歌添加”后诗歌 pyproject.toml 未更新
- html - 如何解决html表格中的行不连续(python fpdf2生成PDF文档)
- javascript - eCharts Canvas 不会在 .resize() 上设置高度动画
- python - 缩放图像后如何获得平滑的直方图?