【问题标题】:Default values missing for ServiceStack.XmlServiceClient responseServiceStack.XmlServiceClient 响应缺少默认值
【发布时间】:2018-06-12 16:23:21
【问题描述】:

在多个 ServiceStack 服务客户端的单元测试中使用 TestCaseSource 时,反序列化为 XmlServiceClient 的字符串格式与反序列化的 JsonServiceClient 或 JsvServiceClient 不匹配。序列化使用 ServiceStack.Text.TypeSerializer 类中的 SerializeAndFormat 扩展方法。

使用OnDeserializing 功能似乎无法提供相同的格式化字符串,因为它缺少默认值。

使用相同的 JsConfig 范围,在调用 SerializeAndFormat 方法之前将 excludeDefaultValues 设置为 false。 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
}

【问题讨论】:

  • 您能向我们展示一些与此问题相关的代码吗?

标签: nunit servicestack approval-tests


【解决方案1】:

ServiceStack 使用 .NET DataContract Serializer for XML,因此它仅限于它提供的行为和功能。

JsConfig 仅适用于 ServiceStack 实现的文本序列化器,主要为 JSON/JSV 设计,部分由 CSV 使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多