版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7574569.html

这两天博主在接微信支付SDK的时候碰到一个非常恶心又诡异的问题——proto序列化和反序列化的无辜崩溃

上图就是博主遇到这个问题时正在调试微信支付的核心协议,博主在序列化和反序列化该消息的字节组时,unity就会立马崩溃,遇到过unity崩溃的朋友应该都知道,unity会给出两个用于查找问题的文件,一个crash.dmp和一个error.log

error.log文件会输出堆栈的二进制数据,表示看不懂,所以只能看crash.dmp这个错误报告文件了

如果电脑上装了vs,可以直接打开,打开后显示如下

提示的意思简单点说就是内存越界,然而,经过博主调试后发现导致unity崩溃的函数就是protobuf-net.dll提供的反序列化函数

----> Serializer.Serialize<IExtensible>();

然而直到这个并没有什么卵用,因为根本无法锁定到问题的核心所在

于是博主开始各种尝试:

首先,怀疑命名问题,因为协议中定义了一些看起来可能会冲突的名字:比如package

于是,博主注释掉这些看起来可疑的属性,包括appId、return_code、return_msg、err_code、err_code_des、package,结果是依然崩溃

然后继续注释掉notify_url、sign,结果没有崩溃

所以博主开始怀疑是notify_url、sign这两个属性搞的鬼,于是分开取消注释测试,发现不论取消注释哪一个,都会崩溃

好吧,凌乱了,毫无头绪,尤其是在随便更改这些属性的命名后都一样后就更加没有头绪了

所以最后不得不得出结论:并不是命名的问题

再想到文件大小的问题,博主为了省事,将所有的协议全部打包到一个cs文件中,最终这个文件有378kb,8000+行代码,这个量严格来说不算大,毕竟过万行代码的多得是

但是确实也想不到其他的可能了

按照这个思路,博主将最终生成的类文件分成多个,测试后发现还是崩溃

那么也不是文件大小的问题,这下就无奈了,错误报告太简单,解决方案也太诡异,实在无法找到错误原因,按道理unity的日志应该不会这么简单

于是,就去查unity自己的日志文件,地址如下

打开后,总算发现了一些端倪

在日志文件最底部,崩溃前的堆栈日志说明,崩溃的元凶就是proto的序列化,但是最后的utf16_to_utf8_len是什么鬼,博主表示看不懂

但是意思应该就是编码格式的转换问题了

回到协议内容一看,发现这个协议有个特点,全都是string,好吧,虽然这个可能有点扯,并且可能还不是核心,但是先试试吧

把所有的类型全部换成int,奇迹出现了,没有崩溃

再来,全部还原,然后只把appId的类型改成int,结果没有崩溃

好吧,貌似是类型全都是string的原因,但是前面只有4个属性的时候没有崩溃又是什么原因,况且也并不是没有出现过全部都是string的协议

再试试别的可能,比如修改必要性,把appId改为required等等等。。。。

经过一番测试,终于得出了如下结论(unity版本5.6.2,protobuf-net.dll版本2.3.2):

单个协议全部是optional string的情况下

修改其中一条属性类型为int或bool时,不会崩溃
修改其中一条属性为required时,不会崩溃
减少单个协议的属性数量到4个,不会崩溃,超过或等于5个,崩溃

总结:所有属性全为optional时,属性类型不能全部为string,反之则不能全为optional

上面的问题不知道大家有没有遇到过,希望大家没有遇到过,一次就能恶心半天了。

虽然问题解决了,但还是知其然不知其所以然,如果有朋友知道本质原因,希望可以分享

unity探索者之protobuf的序列化和反序列化导致unity崩溃的问题研究的更多相关文章

  1. Unity中进程间通信——使用Protobuf-net序列化与反序列化

    基于ProtoBuf协议实现网络传输(上) Protobuf 全称Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格 ...

  2. [Go] 使用protobuf进行序列化和反序列化

    先定义消息类型 orders.proto syntax = "proto2"; package message; message Orders { required int32 o ...

  3. Unity使用protobuf-net进行二进制序列化与反序列化

    Protobuf-net提供的一种易于使用的数据序列化方案,可序列化带有[ProtoContract]特性的类实例,并可支持Unity各个发布平台,且效率高.易用性强. public static c ...

  4. Json序列化与反序列化导致多线程运行速度和单线程运行速度一致问题

    紧跟上篇文章 十个进程开启十个bash后一致写入命令执行完毕之后产生了很多很多的文件,博主需要对这些文件同意处理,也就是说对几十万个文件进行处理,想了又想,单线程处理那么多数据肯定不行,于是乎想到了使 ...

  5. 序列化和反序列化及Protobuf 基本使用

    序列化和反序列化 序列化和反序列化在平常工作中会大量使用,然而并不一定非常清楚它的概念.序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式.大数据量系统设计里面更为显著.机器间的通信需要 ...

  6. windows环境下protobuf的java操作{编译,序列化,反序列化}

    google protocol buffer的使用和原理 概况: Protocol Buffers(也就是protobuf)是谷歌的语言中立的.平台中立的.可扩展的用于序列化结构化的数据: windo ...

  7. C# 使用 protobuf 进行对象序列化与反序列化

    protobuf 是 google的一个开源项目,可用于以下两种用途: (1)数据的存储(序列化和反序列化),类似于xml.json等: (2)制作网络通信协议. 源代码下载地址:https://gi ...

  8. ProtoBuf序列化和反序列化方法

    最近公司需要将以前的协议全都改成ProtoBuf生成的协议,再将结构体打包和解包过程终于到一些问题 ,无法使用Marshal.SizeOf计算结构体大小,最后找了一下ProtoBuf的文档,可以用它自 ...

  9. unity 序列化和反序列化

    什么是序列化和反序列化(1)序列化是指把对象转换为字节序列的过程,而反序列化是指把字节序列恢复为对象的过程:.  (2)序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可 ...

随机推荐

  1. LGV定理

    LGV定理用于解决路径不相交问题. 定理 有 \(n\) 个起点 \(1, 2, 3, ..., n\),它们 分别对应 要到 \(n\) 个终点 \(A, B, C, ..., X\),并且要求路径 ...

  2. WPF入门教程(一)---基础

    这篇主要讲WPF的开发基础,介绍了如何使用Visual Studio 2013创建一个WPF应用程序. 首先说一下学习WPF的基础知识: 1) 要会一门.NET所支持的编程语言.例如C#. 2) 会一 ...

  3. vue学习(十四) 条件搜索框动态查询表中数据 数组的新方法

    //html <div id="app"> <label> 名称搜索关键字: <input type="text" clasa=& ...

  4. MySQL组复制MGR(四)-- 单主模式与多主模式

    (一)概述 组复制可以运行在单主模式下,也可以运行在多主模式下,默认为单主模式.组的不同成员不能部署在不同模式下,要切换模式,需要使用不同配置重新启动组而不是单个server. 相关参数如下: # 该 ...

  5. JVM系列之:String.intern的性能

    目录 简介 String.intern和G1字符串去重的区别 String.intern的性能 举个例子 简介 String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字 ...

  6. OKHttp 官方文档【一】

    最近工作比较忙,文章更新出现了延时.虽说写技术博客最初主要是写给自己,但随着文章越写越多,现在更多的是写给关注我技术文章的小伙伴们.最近一段时间没有更新文章,虽有工作生活孩子占用了大部分时间的原因,但 ...

  7. BSOJ 5445 -- 【2018雅礼】树 prufer序列 dp

    BSOJ在哪我也不知道 没有链接. 对于有标号无根树的统计和有度数限制 一般采用prufer序列. 根据prufer序列 容易知道 某个点的出现次数+1为当前点的度数. 对于这道题 考虑设f[i][j ...

  8. Python编程初学者指南PDF高清电子书免费下载|百度云盘

    百度云盘:Python编程初学者指南PDF高清电子书免费下载 提取码:bftd 内容简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python可以用于很多的领域,从科学计算 ...

  9. ios迅雷上架成功的秘密 背后的“苹果TF签名”

    距离ios迅雷从App Store下架已经过去很久了,小微经常看到知乎里有很多迅雷用户到处寻找可以下载应用的渠道.近期迅雷被爆“好消息”iOS 迅雷(官方版)正式上架 App Store,此消息一出可 ...

  10. cocos2d-x_下载游戏引擎并创建第一个项目

    我是一名小白. 下载并创建游戏项目 第一步:去官网下载cocos2d-x http://www.cocos.com/download 第二步:将安装包里边的 setup.py 拖进命令行点击回车键 , ...