ServiceStack.Text JsConfig.IncludePublicFields = true不适用于DataContracts

时间:2013-10-25 00:56:34

标签: c# json servicestack deserialization datacontract

我在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函数)。

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

0 个答案:

没有答案