servicestack,deserialization,datacontract,C#,Json,servicestack,Deserialization,Datacontract" /> servicestack,deserialization,datacontract,C#,Json,servicestack,Deserialization,Datacontract" />

C# ServiceStack.Text JsConfig.IncludePublicFields=true不';不能使用数据合同

C# ServiceStack.Text JsConfig.IncludePublicFields=true不';不能使用数据合同,c#,json,servicestack,deserialization,datacontract,C#,Json,servicestack,Deserialization,Datacontract,我设置ServiceStack.Text.JsConfig.IncludePublicFields=true,但公共字段仍然没有以JSON格式反序列化。 以下是一个简化的示例: [DataContract(Name = "RspItems")] public class RspItems<T1> { [DataMember] public int ItemCount { get { return Items == null ? 0 : Items.Count; } s

我设置
ServiceStack.Text.JsConfig.IncludePublicFields=trueAppHost.Configure
中的code>,但公共字段仍然没有以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;
    }
}
[DataContract(Name=“RspItems”)]
公共类资源
{
[数据成员]
public int ItemCount{get{return Items==null?0:Items.Count;}set{}
[数据成员]
公共物品;
公共无效设置项(T1项)
{
如果(项!=null)
{
项目=新列表(1);
项目。添加(项目);
}
}
公共无效设置项(IList项)
{
项目=项目;
}
}
[DataContract(Name=“UserInfo”)]
公共类用户信息
{
[数据成员]
公共int用户id;
[数据成员]
公共字符串登录名;
[数据成员]
公共字符串名;
[数据成员]
公共字符串LastName;
[数据成员]
公共字符串评论;
}
公共类UserInfoReq:IReturn
{
public int?UserID{get;set;}
}
[路由(“/app/user/list”,“GET”)]
公共类UserInfoGetReq:UserInfoReq{}
公共类用户列表:服务
{
公共RspItems Get(UserInfoGetReq)
{
RspItems rsp=新的RspItems();
UserInfo u=新的UserInfo();
u、 UserID=3418;
u、 LoginName=“jsmith”;
u、 FirstName=“约翰”;
u、 LastName=“史密斯”;
u、 Comment=req.UserID.HasValue?req.UserID.ToString():“NULL”;
rsp.设定项目(u);
返回rsp;
}
}
上面的示例没有以JSON格式反序列化响应对象,尽管它是以XML格式工作的。 但令人费解的是,如果我删除类上的
DataContract
属性,JSON格式就可以工作了。 这是虫子吗

另外,在上面的请求DTO中,如果我将
UserID
设置为一个简单的公共字段(而不是属性),那么它不会从querystring反序列化。为什么?

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

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