使用IL2CPP对lib类进行XML序列化有什么问题?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (21)

在Unity项目上将脚本后端从Mono设置为IL2CPP后,它会在运行lib类的XML反序列化(来自dll库)时在运行时抛出异常。

Google Play很快将不再接受不包含64位版本的版本。这在Unity中意味着我们必须从Mono切换到IL2CPP。目标设备是Android设备。

我们尝试使用各种版本的.Net Framework构建dll库。我们还尝试在默认构造函数中添加一些指令(无参数)。然后我们在反序列化调用之前使用构造函数,以防在构建时剥离。我们试图通过代码强制禁用剥离级别,但我们不知道它是否有效。

这是问题发生的类,反序列化失败。

namespace Api.Common.Licence
{
    [XmlRoot(ElementName = "DeviceLicenceFile")]
    public class DeviceLicenceFile
    {
        public DeviceLicenceFile()
        {
            //Email = null; //tried that for an example but is usually empty
        }

        [XmlElement(ElementName = "Email")]
        public string Email { get; set; }
        [...]
    }
}

这是我的序列化功能

public static T Deserialize<T>(string text)
{
    var serializer = new XmlSerializer(typeof(T));
    T obj = (T) (serializer.Deserialize(new StringReader(text)));
    return obj;
}

一切都适用于Mono,但是使用IL2CPP,它会抛出以下错误=>“System.InvalidOperationException:有一个错误反映了类型'Api.Common.Licence.DeviceLicenceFile'.---> System.InvalidOperationException:Api.Common.Licence。 DeviceLicenceFile无法序列化,因为它没有默认的公共构造函数“当然,我们有一个无参数构造函数。

编辑:我们在Unity 2018.4上

提问于
用户回答回答于

这里的问题可能是IL2CPP DeviceLicenceFile在构建期间删除了类,因为它只用于泛型/反射。(IL2CPP执行托管代码剥离以减少二进制大小/构建时间。)

您可以将整个程序集(或仅该类型)添加到一个名为link.xml必须放在Assets目录根目录中的文件中,这将告诉Unity不要删除该类。有关详细信息,请参阅此处的文档:https//docs.unity3d.com/Manual/IL2CPP-BytecodeStripping.html - 您将在“使用时如何处理剥离”部分中找到所需文件内容的示例反射”。

扫码关注云+社区

领取腾讯云代金券