Unity3D中項(xiàng)目打包Android平臺(tái)包運(yùn)行過(guò)程中拋出異常:JSON integer is too large or small for an Int64
背景:
博主在打包的過(guò)程中,“屢次接收到”報(bào)錯(cuò)啦 ? ” “打包了沒(méi)?”“打好了沒(méi)?”,我可以很肯定地告訴你:,作為一個(gè)打包仔而言,老老實(shí)實(shí)解決bug解決問(wèn)題比較重要,
可能是項(xiàng)目中之前的數(shù)據(jù)沒(méi)有達(dá)到這么大的一個(gè)閾值,當(dāng)遇到這種情況后就確實(shí)有點(diǎn)頭疼難解了。多處引用,改動(dòng)風(fēng)險(xiǎn)比較大畢竟跟項(xiàng)目掛鉤的比較緊密,時(shí)間也比較緊。然后在網(wǎng)上搜索相關(guān)的內(nèi)容后,大概也是給了一個(gè)簡(jiǎn)單的思路,后續(xù)的內(nèi)容還是已經(jīng)解決的這個(gè)問(wèn)題后才發(fā)現(xiàn)的,所以后續(xù)的思路僅供參考。替換dll是伴隨風(fēng)險(xiǎn)的,除非一開(kāi)始項(xiàng)目采用的就是新版的,否則一般不要這么去做。期間的改動(dòng),需要大家一起去評(píng)估對(duì)項(xiàng)目的影響和風(fēng)險(xiǎn),采取最適合風(fēng)險(xiǎn)最低的方式去處理。大概就總結(jié)了一個(gè)這樣的解決問(wèn)題的思路文章。
一、遇到情況描述:
-
項(xiàng)目代碼中涉及到了采用微軟下 Newtonsoft.Json.dll解析庫(kù),數(shù)據(jù)序列化與反序列化的過(guò)程
-
???Unity打包過(guò)程中不報(bào)錯(cuò),手機(jī)調(diào)試運(yùn)行過(guò)程中拋出異常;(這個(gè)比較坑,槽點(diǎn)在于如果你調(diào)試的過(guò)程中沒(méi)有去try catch,unity下是無(wú)法捕獲的)
-
項(xiàng)目中序列化的過(guò)程中采用了下述這種方式:
-
JsonConvert.SerializeObject(data, settings);
-
反序列化的過(guò)程中采用了下述這種解析方式:
-
JsonConvert.DeserializeObject<xxxProtoInfo>(jsondata);
-
在試圖對(duì)Ulong類(lèi)型的數(shù)據(jù)進(jìn)行解析的過(guò)程中:拋出以下異常
Newtonsoft.Json.JsonReaderException : JSON integer 9111111111111111117 is too large or small for an Int64. Path ‘xxxparm’, line 1, position 58.
at Newtonsoft.Json.JsonTextReader.ParseNumber (Newtonsoft.Json.ReadType readType)
at Newtonsoft.Json.JsonTextReader.ParseValue ()
at Newtonsoft.Json.JsonTextReader.Read ()
at Newtonsoft.Json.JsonReader.ReadAndMoveToContent ()
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType (Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonContract contract, System.Boolean hasConverter)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject (System.Object newObject, Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonObjectContract contract, Newtonsoft.Json.Serialization.JsonProperty member, System.String id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType, System.Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00053] in
at Newtonsoft.Json.JsonSerializer.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00000] in
at Newtonsoft.Json.JsonConvert.DeserializeObject (System.String value, System.Type type, Newtonsoft.Json.JsonSerializerSettings settings)
at Newtonsoft.Json.JsonConvert.DeserializeObject[T] (System.String value, Newtonsoft.Json.JsonSerializerSettings settings) [0x00000] in
at Newtonsoft.Json.JsonConvert.DeserializeObject[T] (System.String value)
二、導(dǎo)致的原因:
1、 ??**罪魁禍?zhǔn)?** Newtonsoft.json.dll 版本較低(.net 3.5版本),類(lèi)庫(kù)文件本身不支持ulong類(lèi)型的反序列化轉(zhuǎn)換。
通過(guò)上述描述,我們其實(shí)也得知了,就是此處類(lèi)型的bug,為了更加方便理解,翻譯如下:
???所以綜上所述,如果您在項(xiàng)目當(dāng)中采用到了Newtonsoft.Json做轉(zhuǎn)換,并且拋出了此類(lèi)的異常,估計(jì)就是以上原因了,即采用了一個(gè)并不適配ulong類(lèi)型或者更大的值的 dll庫(kù)文件,既然遇到了此類(lèi)問(wèn)題,一定是有辦法解決的,作者也貼心的在github中提到了解決方式,”簡(jiǎn)單且粗暴??“ ,即序列化成字符串后再自己進(jìn)行轉(zhuǎn)換。作者也表示后續(xù)講修復(fù)這個(gè)問(wèn)題(目前來(lái)說(shuō)也的確修復(fù)了這個(gè)問(wèn)題,親測(cè),但是至于序列化的過(guò)程有沒(méi)有差異就不知道了)
三、解決方案:
解決方案一:String手動(dòng)解析
將數(shù)據(jù)序列化成string后,對(duì)string進(jìn)行劃分并解析成對(duì)應(yīng)的類(lèi)結(jié)構(gòu)即數(shù)據(jù)結(jié)構(gòu)(已解決,代碼有優(yōu)化空間)
public static TestInfo1 ConvertByJsonData(List<string> jsonData)
{
TestInfo1 info = new TestInfo1(0, 0, 0, null);//假定TestInfo1中的類(lèi)結(jié)構(gòu)成員為(string,int,ulong,TestInfo)對(duì)應(yīng)類(lèi)型的變量;
if (jsonData!=null && jsonData.Count > 0)
{
for (var i = 0; i < jsonData.Count; i++)
{
switch (jsonData[i])
{
case "key1":
infoValue1 = jsonData[i+1];//將string解析成類(lèi)結(jié)構(gòu)成員變量,注意:記得匹配類(lèi)型;假定infoValue1 為string類(lèi)型
break;
case "key2":
infoValue2= int.Parse(jsonData[i+1]);//將string解析成類(lèi)結(jié)構(gòu)成員變量,注意:記得匹配類(lèi)型;假定infoValue2 為Int類(lèi)型
break;
case "key3":
infoValue3 = ulong.Parse(jsonData[i+1]);//將string解析成類(lèi)結(jié)構(gòu)成員變量,注意:記得匹配類(lèi)型;假定infoValue3 為ulong類(lèi)型
break;
case "key4":
if (jsonData[i + 1] != "null")
{
//類(lèi)結(jié)構(gòu)中包含類(lèi)結(jié)構(gòu),跟這個(gè)同樣的結(jié)構(gòu)去解析
TestInfo2 testinfo2 = xxxxx.ConvertByJsonData(List<string> jsonData)
}
break;
}
}
}
return info;
}
解決方案二:更新Newtonsoft.Json的Dll庫(kù)
-
更新dll庫(kù),照搬原方法,替換庫(kù)文件即可(注意平臺(tái)依賴關(guān)系,防止無(wú)用功打包)
-
更新項(xiàng)目中引用所依賴的dll庫(kù),更新為已解決該問(wèn)題的dll庫(kù)即可。
(未親測(cè),測(cè)過(guò)一個(gè)版本有問(wèn)題,由于比較急,暫時(shí)還是采用的自己手動(dòng)解析的方法做的處理)
-
注意:相差版本過(guò)大,部分方法或許可能存在不適配;博主踩過(guò)坑…
四、參考鏈接:
以下貼上對(duì)應(yīng)庫(kù)下載地址以及作者的github鏈接地址,大家自行進(jìn)行了解和學(xué)習(xí);
一個(gè)簡(jiǎn)單好用的json 轉(zhuǎn)換網(wǎng)址: https://codebeautify.org/string-to-json-online
Json.Net 下載地址: https://www.newtonsoft.com/json
Json.Net 源碼地址:https://github.com/JamesNK/Newtonsoft.Json
如果您遇到了這個(gè)問(wèn)題,并且我的文章確確實(shí)實(shí)幫到您了,希望您給一個(gè)贊支持一下我呀,喜歡我的文章的朋友也可以關(guān)注我的博客,關(guān)注我的后續(xù)的文章分享呀,謝謝啦。
公眾號(hào):平平無(wú)奇代碼猴
也可以搜索:Jackiie_wang 公眾號(hào),歡迎大家關(guān)注!歡迎催更!留言!
作者:ProMer_Wang
鏈接:https://blog.csdn.net/qq_43801020/article/details/129596819文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-491990.html
本文為ProMer_Wang的原創(chuàng)文章,著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明原文出處,歡迎轉(zhuǎn)載!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-491990.html
到了這里,關(guān)于Unity3D中項(xiàng)目打包Android平臺(tái)包運(yùn)行過(guò)程中拋出異常:JSON integer is too large or small for an Int64的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!