Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64

这篇具有很好参考价值的文章主要介绍了Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64

背景:

博主在打包的过程中,“屡次接收到”报错啦 ❗ ” “打包了没❗”“打好了没❗”,我可以很肯定地告诉你:Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64,作为一个打包仔而言,老老实实解决bug解决问题比较重要,Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64可能是项目中之前的数据没有达到这么大的一个阈值,当遇到这种情况后就确实有点头疼难解了。多处引用,改动风险比较大毕竟跟项目挂钩的比较紧密,时间也比较紧。然后在网上搜索相关的内容后,大概也是给了一个简单的思路,后续的内容还是已经解决的这个问题后才发现的,所以后续的思路仅供参考。替换dll是伴随风险的,除非一开始项目采用的就是新版的,否则一般不要这么去做。期间的改动,需要大家一起去评估对项目的影响和风险,采取最适合风险最低的方式去处理。大概就总结了一个这样的解决问题的思路文章。

一、遇到情况描述:

  • 项目代码中涉及到了采用微软下 Newtonsoft.Json.dll解析库,数据序列化与反序列化的过程

  • ❗❗❗Unity打包过程中不报错,手机调试运行过程中抛出异常;(这个比较坑,槽点在于如果你调试的过程中没有去try catch,unity下是无法捕获的)

  • 项目中序列化的过程中采用了下述这种方式:

  • JsonConvert.SerializeObject(data, settings);
    
  • 反序列化的过程中采用了下述这种解析方式:

  • JsonConvert.DeserializeObject<xxxProtoInfo>(jsondata);
    
  • 在试图对Ulong类型的数据进行解析的过程中:抛出以下异常Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64


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)

二、导致的原因:

1、 👀**罪魁祸首 ** Newtonsoft.json.dll 版本较低(.net 3.5版本),类库文件本身不支持ulong类型的反序列化转换。

Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64

通过上述描述,我们其实也得知了,就是此处类型的bug,为了更加方便理解,翻译如下:

Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64

❗❗❗所以综上所述,如果您在项目当中采用到了Newtonsoft.Json做转换,并且抛出了此类的异常,估计就是以上原因了,即采用了一个并不适配ulong类型或者更大的值的 dll库文件,既然遇到了此类问题,一定是有办法解决的,作者也贴心的在github中提到了解决方式,”简单且粗暴🐧“ ,即序列化成字符串后再自己进行转换。作者也表示后续讲修复这个问题(目前来说也的确修复了这个问题,亲测,但是至于序列化的过程有没有差异就不知道了Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64

Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64

Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64

三、解决方案:

解决方案一:String手动解析

将数据序列化成string后,对string进行划分并解析成对应的类结构即数据结构(已解决,代码有优化空间)

public static TestInfo1 ConvertByJsonData(List<string> jsonData)
{
    TestInfo1 info = new TestInfo1(0, 0, 0, null);//假定TestInfo1中的类结构成员为(string,int,ulong,TestInfo)对应类型的变量;
    if (jsonData!=null && jsonData.Count > 0)
    {
        for (var i = 0; i < jsonData.Count; i++)
        {
            switch (jsonData[i])
            {
                case "key1":
                   infoValue1 = jsonData[i+1];//将string解析成类结构成员变量,注意:记得匹配类型;假定infoValue1 为string类型
                    break;
                case "key2":
                    infoValue2= int.Parse(jsonData[i+1]);//将string解析成类结构成员变量,注意:记得匹配类型;假定infoValue2 为Int类型
                    break;
                case "key3":
                    infoValue3 = ulong.Parse(jsonData[i+1]);//将string解析成类结构成员变量,注意:记得匹配类型;假定infoValue3 为ulong类型
                    break;
                case "key4":
                    if (jsonData[i + 1] != "null")
                    {
                    	//类结构中包含类结构,跟这个同样的结构去解析
                        TestInfo2 testinfo2 = xxxxx.ConvertByJsonData(List<string> jsonData)
                    }
                    break;
            }
        }
    }
    
    return info;
}

解决方案二:更新Newtonsoft.Json的Dll库

  • 更新dll库,照搬原方法,替换库文件即可(注意平台依赖关系,防止无用功打包)

  • 更新项目中引用所依赖的dll库,更新为已解决该问题的dll库即可。

    (未亲测,测过一个版本有问题,由于比较急,暂时还是采用的自己手动解析的方法做的处理)

  • 注意:相差版本过大,部分方法或许可能存在不适配;博主踩过坑…

四、参考链接:

以下贴上对应库下载地址以及作者的github链接地址,大家自行进行了解和学习;

一个简单好用的json 转换网址: https://codebeautify.org/string-to-json-online

Json.Net 下载地址: https://www.newtonsoft.com/json

Json.Net 源码地址:https://github.com/JamesNK/Newtonsoft.Json

Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64
如果您遇到了这个问题,并且我的文章确确实实帮到您了,希望您给一个赞支持一下我呀,喜欢我的文章的朋友也可以关注我的博客,关注我的后续的文章分享呀,谢谢啦。Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64

公众号:平平无奇代码猴
也可以搜索:Jackiie_wang 公众号,欢迎大家关注!欢迎催更!留言!

作者:ProMer_Wang

链接:https://blog.csdn.net/qq_43801020/article/details/129596819

本文为ProMer_Wang的原创文章,著作权归作者所有,转载请注明原文出处,欢迎转载!文章来源地址https://www.toymoban.com/news/detail-491990.html

到了这里,关于Unity3D中项目打包Android平台包运行过程中抛出异常:JSON integer is too large or small for an Int64的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity3D】Android 打包 ② ( Android 编译选项 | Android 工程设置 | 配置基本信息 | 配置不同分辨率图标 | 配置启动动画 | 其它设置 )

    在上一篇博客 【Unity3D】Android 打包 ① ( Android 编译选项 | 安装 Android Build Support 模块 ) 中 讲解了 Android 打包的最基本配置 , 安装 Android Build Support 模块 ; 本篇博客继续讲解后续工作 ; 在 Unity 编辑器中选择 \\\" 菜单栏 | File | Build Settings \\\" 选项 , 点击 Build Settings 对话框的左下角的

    2023年04月19日
    浏览(63)
  • Unity打包错误:无法成功进行Unity3D应用程序打包

    在Unity开发过程中,有时候会遇到各种各样的错误。其中一个常见的问题是无法成功进行Unity3D应用程序的打包。本文将探讨可能导致此错误的几种常见情况,并提供相应的解决方案。 资源文件丢失或路径错误: 打包应用程序时,确保所有所需的资源文件都存在,并且路径设

    2024年01月16日
    浏览(47)
  • Unity3D打包Assetbundle丢失Shader问题

    详情见:https://www.pianshen.com/article/5391338163/ 1、Unity3D在打包Assetbundle时,可能会遇到Shader丢失的问题,解决方法:打开 Edit-Project Settings-Graphics,在Always Included Shaders列表添加上所需的shader ,再打包即可。 2、参考 3、原文复制 Scriptable RenderLoop settings This is an experimental setting wh

    2023年04月22日
    浏览(60)
  • 如何将Unity3D中的脚本打包成为DLL类库?

    如果我们想把代码打成DLL,首先需要有一个Assembly和一个合理的代码目录结构规划。 1.将要归为一类的脚本放进同一个文件内,在该文件夹下右键创建一个Assembly Definition,默认它会将同文件夹以及子目录内的脚本归为一个Assembly。 2.在Editor下创建一个CompileDll脚本来将我们的脚

    2024年02月12日
    浏览(41)
  • Unity3D:2D/3D 项目

    推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 无论是创建 2D 还是 3D 游戏,Unity 都很拿手。在 Unity 中创建新项目时,可以选择以 2D 或 3D 模式启动。您可能已经知道要构建什么,但有一些细微的要点可能会影响选择的模式。 选择是以 2D 还是 3D 模式启

    2024年02月07日
    浏览(61)
  • 【虚拟仿真】Unity3D打包WEBGL后播放视频(VideoPlayer组件)

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 本篇文章实现Unity3D打包WEBGL后播放视频,如下图所示: 使用了VideoPlayer组件,代码比较简单。 主要就

    2023年04月25日
    浏览(61)
  • Unity3D中打包WEBGL后读取本地文件数据+网络请求

    首先上一编博主运行html之后报的错误:提示内存不足!!!! 1.首先排查一下webgl包的大小,不能超过2G。 2.F12查看具体错误,在这里博主的是:        a:本地读取StreamingAssets里的配置文件,序列化失败。        b:网络请求方法不能使用JsonConvert.SerializeObject将对象重新序列

    2024年02月08日
    浏览(58)
  • 【Unity3D】Unity与Android交互

            本文主要介绍 Unity 打包发布 Android apk 流程、基于 AndroidJavaObject(或 AndroidJavaClass)实现 Unity 调用 Java 代码、基于 UnityPlayer 实现 Java 调用 Unity 代码,官方介绍见→Android。         Unity 项目 C# 中获取平台的代码如下,需要引入 UnityEngine 命名空间。         Ru

    2024年02月07日
    浏览(47)
  • 解决Unity3D打包到PC端,UGUI的格式错乱问题

    Tips:在UI界面开始设计之前,一定先要设置好各项UI元素的参照位置,以及参考的屏幕分辨率比例,不然你精心设计好的UI界面在别人电脑上一看,直接堆在了一起或者根本显示不全,后面再改会很麻烦。 前言:本文主要分两部分,主讲第一部分。并不是第二部分不重要,而

    2024年02月07日
    浏览(52)
  • 一次Unity3D IL2CPP 打包错误

    目录 一、错误描述 二、问题分析 三、解决方法 四、效果验证 五、后记 采用IL2CPP生成的时候,出现了4个错误: (1)Building LibraryBeeartifactsWinPlayerBuildProgramei6vjku08_i_vm6.lump.obj failed with output: (2)BuildFailedException: Incremental Player build failed! (3)Build completed with a result of ‘

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包