2

我设置ServiceStack.Text.JsConfig.IncludePublicFields = true;了,AppHost.Configure但公共字段仍然没有以 JSON 格式反序列化。这是一个简化的示例:

[DataContract(Name = "RspItems")]
public class RspItems<T1>
{
    [DataMember]
    public int ItemCount { get { return Items == null ? 0 : Items.Count; } set { } }
    [DataMember]
    public IList<T1> Items;
    public void SetItems(T1 item)
    {
        if (item != null)
        {
            Items = new List<T1>(1);
            Items.Add(item);
        }
    }
    public void SetItems(IList<T1> items)
    {
        Items = items;
    }
}
[DataContract(Name="UserInfo")]
public class UserInfo
{
    [DataMember]
    public int UserID;
    [DataMember]
    public string LoginName;
    [DataMember]
    public string FirstName;
    [DataMember]
    public string LastName;
    [DataMember]
    public string Comment;
}
public class UserInfoReq<T> : IReturn<RspItems<T>>
{
    public int? UserID { get; set; }
}
[Route("/app/user/list", "GET")]
public class UserInfoGetReq : UserInfoReq<UserInfo> { }

public class UserList : Service
{
    public RspItems<UserInfo> Get(UserInfoGetReq req)
    {
        RspItems<UserInfo> rsp = new RspItems<UserInfo>();
        UserInfo u = new UserInfo();
        u.UserID = 3418;
        u.LoginName = "jsmith";
        u.FirstName = "John";
        u.LastName = "Smith";
        u.Comment = req.UserID.HasValue ? req.UserID.ToString() : "NULL";
        rsp.SetItems(u);
        return rsp;
    }
}

上面的示例没有反序列化 JSON 格式的响应对象,尽管它以 XML 格式工作。但莫名其妙的是,如果我删除DataContract类上的属性,JSON 格式就可以了。这是一个错误吗?

此外,在上面的请求 DTO 中,如果我创建UserID了一个简单的公共字段(而不是一个属性),那么它不会从查询字符串中反序列化。为什么?

为什么ServiceStack默认不包含公共字段?DTO 不应该只是“平面”结构,用作序列化/反序列化输入和输出的容器(即:越简单越好)?公共字段也更小更快(没有生成隐藏的私有字段和 getter/setter 函数)。

注意:请不要建议将所有公共字段都转为属性,因为项目中已经存在大量的序列化结构。许多人来自不同的团队。

4

0 回答 0