Что не так с XML-сериализацией класса lib с IL2CPP? - PullRequest
0 голосов
/ 28 мая 2019

После установки скриптового бэкэнда из Mono в IL2CPP в проекте Unity он выдает исключение во время выполнения, когда запускает десериализацию XML для класса lib (из библиотеки dll).

Скоро Google Playбольше не принимать сборку, которая не включает 64-битную версию.Это значит, что в Unity мы должны перейти с Mono на IL2CPP.Целевое устройство - это устройство Android.

Мы пытались собрать библиотеку dll с различными версиями .Net Framework.Мы также попытались добавить некоторые инструкции в конструктор по умолчанию (без параметров).Затем мы использовали конструктор перед вызовом десериализации, в случае разборки во время сборки.Мы пытались принудительно отключить уровень очистки с помощью кода, но мы не знаем, работает ли он.

Вот класс, в котором возникает проблема, в которой происходит сбой десериализации.

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 не может быть сериализован, потому что у него нет общедоступного конструктора по умолчанию. «Конечно, у нас есть конструктор без параметров.

РЕДАКТИРОВАТЬ: Мы в Unity2018,4

1 Ответ

0 голосов
/ 28 мая 2019

Проблема здесь, вероятно, в том, что IL2CPP удаляет класс DeviceLicenceFile во время сборки, так как он используется только через обобщение / отражение. (IL2CPP выполняет управляемое извлечение кода, чтобы уменьшить размер двоичного файла / время сборки.)

Вы можете добавить всю сборку (или только этот тип) в файл с именем link.xml, который должен быть помещен в корень вашего каталога Assets, что скажет Unity не удалять этот класс. Для получения дополнительной информации см. Документацию здесь: https://docs.unity3d.com/Manual/IL2CPP-BytecodeStripping.html - там вы найдете пример необходимого содержимого файла в разделе «Как бороться с зачисткой при использовании отражения».

...