我在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函数)。
注意:请不要建议只将所有公共字段转换为属性,因为项目中已存在大量序列化结构。许多人来自不同的团队。