protobuf-net运行在Unity上,修复IL2CPP反射不兼容问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了protobuf-net运行在Unity上,修复IL2CPP反射不兼容问题相关的知识,希望对你有一定的参考价值。

参考技术A Unity开发中,我们可能需要用到 protobuf-net 这个C#实现的ProtoBuff库。

但是, protobuf-net 在IL2CPP下,因为反射的一个不兼容问题,是会运行崩溃的,导致ios下没法玩。

这时候需要对 protobuf-net 稍作修改,重新编译出DLL才能在Unity下完美运行。

这种修改,估计很多遇到同样问题的项目都遇过了。 分享给遇到同样困难的人,希望有帮助。

详细修改,放到GitHub的一个分支上了。

https://github.com/kingsoft-topgame/protobuf-net/commit/4eddeeb41b4e67e3ed59b11c727c73a12f48589d

Protobuf-net 和 Unity3D 类型

【中文标题】Protobuf-net 和 Unity3D 类型【英文标题】:Protobuf-net and Unity3D types 【发布时间】:2014-09-23 04:50:19 【问题描述】:

我对 Unity3d 中的 protobuf-net 有疑问。 是否可以序列化 unity3d 类型:GameObject. 例如,我有一个 GameObject 类型的类属性,这个类是序列化/反序列化的?

using ProtoBuf;
using UnityEngine;
...

[ProtoContract]  
public class Example 

   [ProtoMember(1)]
   public int Count get;set;
   [ProtoMember(2)]
   public string Name get;set;
   [ProtoMember(3)]
   public GameObject MyGameObject get;set;  // ???

对不起,我的英语..

【问题讨论】:

您能否提供将GameObject 分配为RunTimeTypeModel 的语法 【参考方案1】:

你必须告诉 protobuf-net 你想序列化哪些类和属性。因为你不能用属性来装饰GameObject,所以有不同的方法来做到这一点。

例如,您可以使用 RuntimeTypeModel.Default 执行此操作,这里是类 Point 的示例,它将属性 XY 设置为序列化。

RuntimeTypeModel.Default
       .Add(typeof(System.Windows.Point), false).Add("X", "Y");

在这种情况下,您的 GameObject 必须有一个默认构造函数。

【讨论】:

能否提供分配GameObjectas RunTimeTypeModel 的语法

以上是关于protobuf-net运行在Unity上,修复IL2CPP反射不兼容问题的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf-net 和 Unity3D 类型

如何修复 c# protobuf-net 中的无效线型问题

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

使用 protobuf-net 反序列化字典

如何在 Unity 上修复“Gradle Build Failed”?

手工使用Protobuf-net工具来序列化对象