使用IL2CPP的lib类的XML序列化有什么问题?

时间:2019-05-28 13:48:39

标签: c# xml unity3d deserialization il2cpp

在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

1 个答案:

答案 0 :(得分:0)

这里的问题可能是IL2CPP在构建过程中正在删除DeviceLicenceFile类,因为它仅通过泛型/反射使用。 (IL2CPP进行托管代码剥离以减少二进制大小/构建时间。)

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