2

我有一些類爲解析網絡響應:System.OverflowException序列化

[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. 

的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響應:

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

請張貼*全*異常堆棧跟蹤。這很可能會讓事情變得更加清晰。如果您要顯示相關數據,這也會有所幫助。 –

+0

那麼你是否要序列化一個大對象? – sino

+0

@sino但爲什麼它改變後工作抽象類 – Alexandr

回答

4

這個數字:3100000100000在您的數據太大,Int32持有它。 Int32的最大正值爲2147483647。你可能會考慮使用Int64(也會太小,因爲它的範圍在4294967295結束)。

然而,code領域通常被解釋爲字符串,所以也許string數據類型是一個更好的選擇,例如:

[DataMember(Name = "code")] 
public string Code { get; set; } 
+0

,但代碼是字符串「代碼」:「3100000100000」,例如時間戳是Int32「時間戳」:1381319677 – Alexandr

+0

在您的實現中,它不是一個字符串,你有:'[DataMember(Name =「code」)] public int Code {get;組; }'所以在反序列化過程中,這個大數目正被轉換爲一個整數。 – BartoszKP

+0

ohhh!我明白了,你很細心!謝謝! – Alexandr