2

Web 応答を解析するためのいくつかのクラスがあります。

[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; }
}

私は使用します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);       
}

私は"System.OverflowException"並んでいます:

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

/checked コンパイラ オプションはオフです。そしてReadObject、この例外をスローできません。

しかし、クラスを書き直すとうまくいきます:

[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; }
}

これがあいまいな質問であることは理解していますが、何が問題なのか理解できません。どの時点でこの例外をスローできますか?

例外情報を更新:

メッセージ:

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

内部例外:

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)

ストラックトレース:

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

Json レスポンス:

{
    "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": ""
        }
    }
}
4

1 に答える 1

4

この数値:3100000100000データは大きすぎInt32て保持できません。の正の最大値はInt32です 2147483647Int64( の範囲が で終わるため、 (UInt32も小さすぎます)を使用することを検討してください4294967295

ただし、codeフィールドは通常文字列として解釈されるため、次のようなstringデータ型の方が適している場合があります。

[DataMember(Name = "code")]
public string Code { get; set; }
于 2013-10-09T14:12:14.230 に答える