0

我是 wcf 和 windows phone 8 应用程序的新手并调用 wcf 服务(其他开发人员)并尝试反序列化数据它有时工作正常但大多数时候它给了我错误

“数据合约类型 'TEST.Model.Response`1[[TEST.Model.Announcement, TEST, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' 无法反序列化,因为成员 'ResponseData' 不是公开。将成员设为公开将修复此错误。或者,您可以将其设为内部,并在程序集上使用 InternalsVisibleToAttribute 属性以启用内部成员的序列化 - 有关更多详细信息,请参阅文档。请注意,这样做具有一定的安全性影响。”

我的模型类是

public class Response<T> where T: class
{
    public string MethodName { get; set; }

    public int ResponseCode { get; set; }

    public string ResponseMessage { get; set; }

    public List<T> ResponseData { get; set; }

}

public class Announcement
{
    public int AnnouncementId { get; set; }

    public string AnnouncementTitle { get; set; }

    public string CreatedBy { get; set; }

    public string CreatedDate { get; set; }

    public string DataShortVersion { get; set; }

    public string ModifiedBy { get; set; }

    public string ModifiedDate { get; set; }

    public int SortIndex { get; set; }
}

当我尝试调用时

var request = ar.AsyncState as WebRequest;
Stream reader = request.EndGetResponse(ar).GetResponseStream(); 

DataContractJsonSerializer jsonSerializer ;\\
jsonSerializer = new DataContractJsonSerializer(typeof(TEST.Model.Response<TEST.Model.Announcement>));
Response<Announcement> objResponse = (Response<Announcement>)jsonSerializer.ReadObject(reader); //error raised
4

1 回答 1

2

下面的SSCCE代码有效。尝试用您的问题自己创建一个,看看它与下面的问题有何不同。这可能会引导您找到答案。

public class StackOverflow_20806241
{
    public class Response<T> where T : class
    {
        public string MethodName { get; set; }
        public int ResponseCode { get; set; }
        public string ResponseMessage { get; set; }
        public List<T> ResponseData { get; set; }
    }
    public class Announcement
    {
        public int AnnouncementId { get; set; }
        public string AnnouncementTitle { get; set; }
        public string CreatedBy { get; set; }
        public string CreatedDate { get; set; }
        public string DataShortVersion { get; set; }
        public string ModifiedBy { get; set; }
        public string ModifiedDate { get; set; }
        public int SortIndex { get; set; }
    }
    public static void Test()
    {
        string JSON = @"{'MethodName':'m1','ResponseCode':1,'ResponseMessage':'msg','ResponseData':[
            {'AnnouncementId':1,'AnnouncementTitle':'t1','CreatedBy':'c1','CreatedDate':'d1','DataShortVersion':'v1','ModifiedBy':'m1','ModifiedDate':'md1','SortIndex':1},
            {'AnnouncementId':2,'AnnouncementTitle':'t2','CreatedBy':'c2','CreatedDate':'d2','DataShortVersion':'v2','ModifiedBy':'m2','ModifiedDate':'md2','SortIndex':2}
        ]}";
        JSON = JSON.Replace('\'', '\"');
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(JSON));
        DataContractJsonSerializer jsonSerializer;
        jsonSerializer = new DataContractJsonSerializer(typeof(Response<Announcement>));
        try
        {
            var objResponse = (Response<Announcement>)jsonSerializer.ReadObject(ms);
            Console.WriteLine("Response:");
            Console.WriteLine("  {0} - {1} - {2}", objResponse.MethodName, objResponse.ResponseCode, objResponse.ResponseMessage);
            Console.WriteLine("  [{0}]", string.Join(", ", objResponse.ResponseData.Select(rd =>
                string.Format("{0}-{1}-{2}-{3}-{4}-{5}-{6}-{7}",
                    rd.AnnouncementId, rd.AnnouncementTitle,
                    rd.CreatedBy, rd.CreatedDate,
                    rd.DataShortVersion, rd.ModifiedBy,
                    rd.ModifiedDate, rd.SortIndex))));
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: {0}", ex);
        }
    }
}
于 2013-12-27T22:02:48.480 回答