protobuf-net 在Unity里使用 int64(long), 在IOS设备上解析错乱问题。。 Mono在IOS反射机制bug

zhenmu 2017-01-23 10:49:41

C#里解析 protobuf 用了 protobuf-net, 一直使用正常的。。 但最近在苹果手机上, 出现莫名其妙问题。
最后发现是 传的Int64字段 解析出来要么很大很大一个,反正不对。。

跟踪 发现
PropertyDecorator.cs里


object newVal = Tail.Read(oldVal, source);
if (readOptionsWriteValue && newVal != null) // if the tail returns a null, intepret that as *no assign*
{
if (shadowSetter == null)
{
property.SetValue(value, newVal, null);
}
else
{
shadowSetter.Invoke(value, new object[] { newVal });
}
}


newVal 读到的是对的。。。。
走到 property.SetValue (反射机制 赋值), 结果里面得到的值就是一个很大很乱的数值。。。。


看来不能用 protobuf-net 或者不要用 有64位字段。

有没有好的Unity里用 protobuf 的解决方案?





目前我们用的是Unity3D 5.3
应该是Mono实现反射机制有问题。 直接写了一个测试代码:

public class Test_Reflect
{
long id = 0;

public long ID
{
get { return id; }
set {
ClientLog.Log("@@@@ set_ID:" + value);
id = value; }
}

public void set_id1(long _i)
{
ClientLog.Log("@@@@ set_id1:" + _i);
id = _i;
}
public void set_id2(System.Int64 _i)
{
ClientLog.Log("@@@@ set_id2:" + _i);
id = _i;
}
}

Test_Reflect tr = new Test_Reflect();
long tt = 1000000000L;
foreach (PropertyInfo property in tr.GetType().GetProperties())
{
//输出属性的类型和变量名
ClientLog.Log("@@@@ test reflect "+property.Name + " : " + property.PropertyType.ToString());
property.SetValue(tr, tt, null);
}
tr.GetType().GetMethod("set_id1").Invoke(tr, new object[] { tt+1 });
tr.GetType().GetMethod("set_id2").Invoke(tr, new object[] { tt + 2 });


在IOS设备上运行, 只要经过反射机制得到的值都是不对的。。。。


...全文
712 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
猪哥亮0 2017-03-05
  • 打赏
  • 举报
回复
下protobuf的源码放到unity中使用而不是dll文件,使用dll文件ios上是不能使用,因为ios平台不允许程序运行时加载其他东西
zhenmu 2017-02-21
  • 打赏
  • 举报
回复
没人知道 原因或者解决方案吗? 目前 只能规避了, 不用64位字段;或者全部放到lua里解析协议; 或者C#里必须要用64位 就传字符串了。。。

2,538

社区成员

发帖
与我相关
我的任务
社区描述
Unity3D相关内容讨论专区
游戏unity 技术论坛(原bbs)
社区管理员
  • Unity3D
  • 芝麻粒儿
  • 「已注销」
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Unity3D社区公告:

  1. 社区致力于解决各种Unity3D相关的“疑难杂症”。
  2. 社区不允许发布与Unity3D或相关技术无关内容。
  3. 社区版主邀请各位一道为打造优秀社区不懈努力。

试试用AI创作助手写篇文章吧