문제

I have a some classes for parse the web response:

[DataContract]
public abstract class GYResponse 
{
    [DataMember(Name = "code")]
    public int Code { get; set; }
    [DataMember(Name = "message")]
    public string Message { get; set; }
}

[DataContract]
public class ResponseGetUser : GYResponse
{
    [DataMember(Name = "result")]
    public GYUser Result { get; set; }
}

[DataContract]
public class ResponseGetVenue : GYResponse
{
    [DataMember(Name = "result")]
    public GYVenue Result { get; set; }
}

I use DataContractJsonSerializer:

GYResponse response_obj = request.Creater.CreateResponseObj(); 
//CreateResponseObj() return ResponseGetUser, ResponseGetVenue etc

using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(gyResponse)))
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(response_obj.GetType());                   
    response_obj = (GYResponse)serializer.ReadObject(stream);       
}

I have "System.OverflowException" in line:

response_obj = (GYResponse)serializer.ReadObject(stream); 

The /checked compiler option is off. And ReadObject can't throw this exception.

But if I rewrite the classes then it works:

[DataContract]
public abstract class GYResponse 
{

}

[DataContract]
public class ResponseGetUser : GYResponse
{
    [DataMember(Name = "result")]
    public GYUser Result { get; set; }
    [DataMember(Name = "code")]
    public int Code { get; set; }
    [DataMember(Name = "message")]
    public string Message { get; set; }
}

[DataContract]
public class ResponseGetVenue : GYResponse
{
    [DataMember(Name = "result")]
    public GYVenue Result { get; set; }
    [DataMember(Name = "code")]
    public int Code { get; set; }
    [DataMember(Name = "message")]
    public string Message { get; set; }
}

I understand that this is a fuzzy question, but can't understand what could be the problem. At what point can throw this exception?

Update exception info:

Message:

 There was an error deserializing the object of type GotYou.RequesterService.ResponseGetInfo. Value was either too large or too small for an Int32.

InnerException:

at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at System.Runtime.Serialization.Json.DataContractJsonSerializer.ConvertObjectToPrimitiveDataContract(DataContract contract, Object value, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.DataContractJsonSerializer.ConvertObjectToDataContract(DataContract contract, Object value, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ReadClassDataContractMembers(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, Object newInstance, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ReadClassDataContractMembers(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, Object newInstance, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ConvertDictionaryToClassDataContract(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.DataContractJsonSerializer.ConvertObjectToDataContract(DataContract contract, Object value, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ReadClassDataContractMembers(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, Object newInstance, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ConvertDictionaryToClassDataContract(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.DataContractJsonSerializer.ConvertObjectToDataContract(DataContract contract, Object value, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ReadClassDataContractMembers(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, Object newInstance, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ConvertDictionaryToClassDataContract(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.DataContractJsonSerializer.ConvertObjectToDataContract(DataContract contract, Object value, XmlObjectSerializerReadContextComplexJson context)
   at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(Stream stream)

StrackTrace:

 at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(Stream stream)
   at GotYou.RequesterService.PostRequester.getResponseCallback(IAsyncResult asynchronousResult)

Json Response:

{
    "code": 0,
    "message": "",
    "result": {
        "uid": "51da997decaa3ca351000000",
        "url": "",
        "nickname": "Smileman",
        "avatar": "\/img\/profile_pics\/users\/51da997decaa3ca351000000\/cache\/avatar48x48.jpg?lastUpdate=1381215566",
        "age": {
            "number": "22",
            "suffix": "года",
            "birthday": "1991-04-17"
        },
        "sex": 1,
        "aboutself": "",
        "premium": true,
        "isFriend": 3,
        "online": {
            "lastVisit": "7 минут назад",
            "status": true
        },
        "features": {
            "car": false,
            "house": false,
            "cash": false,
            "group": true
        },
        "location": {
            "longitude": 36.570838832,
            "latitude": 50.571069472,
            "timestamp": 1381319677
        },
        "bonuses": 8515,
        "address": "",
        "city": {
            "code": "3100000100000",
            "title": ""
        },
        "cover": "\/img\/profile_pics\/users\/51da997decaa3ca351000000\/cache\/hero480x290.jpg?lastUpdate=1381215566",
        "distance": 63.671441859659,
        "paidServices": {
            "vip": true,
            "theming": true,
            "invisible": false,
            "incognito": false,
            "closed": true
        },
        "regdate": "19.08.2013",
        "purpose": {
            "id": "500fa718ecaa3c6e3b000002",
            "title": ""
        }
    }
}
도움이 되었습니까?

해결책

This number: 3100000100000 in your data is too large for Int32 to hold it. Maximum positive value for Int32 is 2147483647. You might consider using Int64 (UInt32 will also be too small, as its range ends at 4294967295).

However, code fields are usually interpreted as strings, so maybe string data type is a better option, for example:

[DataMember(Name = "code")]
public string Code { get; set; }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top