首页 > 解决方案 > Xamarin - Json 反序列化不适用于导出的 Android apk

问题描述


我有一个包含 4 个对象列表(Ambiente、Empresa、Filial e Projeto)的用户模型类的项目。当我从 web 服务(使用 Newtonsoft.Json)获取 Json 数据时,json 代码是正确的,但是在反序列化这些对象列表时,它们在 User 类中总是出现 null。
将链接设置为 SDK Only 后,使用 [Preserve (AllMembers = true)],在 Release 和 Debug 中运行项目时,反序列化工作正常。

我还在 android MainActivity 的 OnCreate 方法中添加了这个:

    受保护的覆盖无效 OnCreate(捆绑包)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = 资源.Layout.Toolbar;
        如果(假标志){
            var falseJC = new Newtonsoft.Json.Converters.BinaryConverter();
        }
        base.OnCreate(捆绑);
    }

这是 User 类和对象列表:

    [保留(所有成员 = true)]
        公共课 Usuario
        {
            公共字符串登录{获取;放; }
            公共 int SessionId { 获取;放; }
            公共字符串名称 { 获取;放; }
            公共字符串电子邮件{获取;放; }
            公共 int EmpresaId { 获取;放; }
            公共 int FilialId { 获取;放; }
            公共 int ProjetoId { 获取;放; }
            公共日期时间数据登录 { 获取;放; }
            公共对象矩阵{得到; 放; }
            公共对象服务器{获取;放; }
            公共字符串 Senha { 获取;放; }
            公共字符串环境{获取;放; }
            公共字符串成语{得到; 放; }
            公共字符串设备{获取;放; }
            公共字符串 Acesso { 获取;放; }
            公共字符串 AmbienteSelecionado { 获取;放; }

            [JsonProperty(PropertyName = "环境")]
            公共列表环境{获取;放; }

            公共列表 Empresas { 获取;放; }
            公共列表 Filiais { 获取;放; }
            公开列表 Projetos { 获取;放; }
        }

        [保留(所有成员 = true)]
        公共课环境
        {
            [JsonProperty(PropertyName = "SGENVIRONMENT")]
            公共字符串 AmbienteId { 获取;放; }

            [JsonProperty(PropertyName = "DSENVIRONMENT")]
            公共字符串 AmbienteNome { 获取;放; }
        }

        [保留(所有成员 = true)]
        公开课 Empresa
        {
            公共 int EmpresaId { 获取;放; }
            公共字符串 RazaoSocial { 获取;放; }
        }

        [保留(所有成员 = true)]
        公共课孝顺
        {
            公共 int FilialId { 获取;放; }
            公共 int EmpresaId { 获取;放; }
            公共字符串标题{获取;放; }
        }

        [保留(所有成员 = true)]
        公共课项目
        {
            公共 int ProjetoId { 获取;放; }
            公共字符串标题{获取;放; }
            公共 int EmpresaId { 获取;放; }
            公共 int FilialId { 获取;放; }
        }

这就是 json 被反序列化的地方:

    Usuario jsonUsuario = JsonConvert.DeserializeObject(json.message.ToString());

一周前,甚至在执行此代码之前,反序列化就起作用了。然后它突然停止在任何情况下工作,没有更改任何代码。
然后我在上面做了所有这些更改,使反序列化在 Visual Studio 上的 Release / Debug 上工作,但是在导出 apk 并运行它时,对象仍然为 Null。

当使用 TraceWriter 拦截反序列化时,日志显示如下:

2020-06-04T18:03:27.142 信息无法将值反序列化为 Gestor_Coletor_A.Models.Usuario 上的不可写属性“Ambientes”。路径“Ambientes”,第 1 行,位置 289。
2020-06-04T18:03:27.161 信息无法将值反序列化为 Gestor_Coletor_A.Models.Usuario 上的不可写属性“Empresas”。路径“Empresas”,第 1 行,位置
560。2020-06-04T18:03:27.171 信息无法将值反序列化为 Gestor_Coletor_A.Models.Usuario 上的不可写属性“Filiais”。路径“Filiais”,第 1 行,位置 838。
2020-06-04T18:03:27.182 信息无法将值反序列化为 Gestor_Coletor_A.Models.Usuario 上的不可写属性“Projetos”。路径“Projetos”,第 1 行,位置 1100。

为什么对象列表被认为是“不可写属性”?它们都是公共的,没有使用私有变量。
我做错了什么?
我必须让它在导出的 apk 上工作。
任何帮助,将不胜感激。

谢谢。

标签: c#androidjsonxamarin

解决方案


推荐阅读