Xamarin 表格 - Serialization/Deserialization 不工作

Xamarin Forms - Serialization/Deserialization not working

预期行为:

在 Xamarin.Forms 项目 (MyApp) 中,我引用了包含自定义模型 (Custom.Netcore.Models.dll) 的 class 库,包含在单独的 project/separate 中解决方案。目标是为我们的 API/Database 从 xml 文件将模型序列化为 json,使用 Newtonsoft.Json 通过 MyApp 的 REST 检索和反序列化它们以填充 ViewModel 对象,通过各种创建更改通过 MyApp 的 UI 进行交互然后将它们序列化并 POST 到 Custom.Netcore.API.

实际行为:

仅当 运行通过 UWP 安装 MyApp 时,预期的行为才会起作用。当尝试通过 Android/iOS(模拟器)运行 解决方案并且应用程序获取 REST 调用以填充 MyApp 的 ViewModels 时,应用程序通过

成功获取序列化数据

var data = await response.Content.ReadAsStringAsync();

然后当应用程序尝试解析数据并通过

将其反序列化到模型时

ObservableCollection<Model> Records = JsonConvert.DeserializeObject<ObservableCollection<Model>>(data);

两个 Android/iOS 此时给出相同的错误并导致应用程序停止 运行ning:

Android:

System.TypeLoadException: 'Could not resolve type with token 0100000c from typeref (expected class 'System.Xml.Serialization.XmlRootAttribute' in assembly 'System.Xml.ReaderWriter, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')'

iOS:

Failed to resolve "System.Void System.Xml.Serialization.XmlRootAttribute::.ctor()" reference from "System.Xml.ReaderWriter, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

但是,我能够通过像

这样的简单操作在所有平台上成功创建和填充用 Custom.Netcore.Models.Model 定义的 ViewModel 对象
ObservableCollection<Model> Records = new ObservableCollection<Model>()
{
    new Model(){ Id = 0, Description = "First Model", Type = "One"},
    new Model(){ Id = 1, Description = "Second Model", Type = "Two"}
};

日志: (Android)

Can't find custom attr constructor image: /storage/emulated/0/Android/data/com.companyname.MyApp/files/.__override__/Custom.Netcore.Models.dll mtoken: 0x0a000010 due to: Could not resolve type with token 0100000c from typeref (expected class 'System.Xml.Serialization.XmlRootAttribute' in assembly 'System.Xml.ReaderWriter, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') assembly:System.Xml.ReaderWriter, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a type:System.Xml.Serialization.XmlRootAttribute member:(null) **System.TypeLoadException:** 'Could not resolve type with token 0100000c from typeref (expected class 'System.Xml.Serialization.XmlRootAttribute' in assembly 'System.Xml.ReaderWriter, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')'

设置:

Custom.Netcore.Api:

XF.MyApp:

Custom.Netcore.Models.Model.cs:

namespace Custom.Netcore.Models
{
    [Serializable()]
    [System.Xml.Serialization.XmlRoot("Model")]
    public class Model
    {
        [System.Xml.Serialization.XmlAttribute("id")]
        public int Id { get; set; }
        [System.Xml.Serialization.XmlAttribute("description")]
        public string Description { get; set; }
        [System.Xml.Serialization.XmlElement("Type")]
        public string Type { get; set; }
    }
}

API数据:

[
  {
    "id": 0,
    "description": "First Model",
    "type" = "One"
  },
  {
    "id": 1,
    "description": "Second Model",
    "type" = "Two"
  }
]

一个星期以来一直在尝试解决此问题,因此我们将不胜感激任何帮助!

这样试试:

namespace Custom.Netcore.Models
{
    [Serializable()]
    [JsonProperty("Model")]
    public class Model
    {
        [JsonProperty("id")]
        public int Id { get; set; }
        [JsonProperty("description")]
        public string Description { get; set; }
        [JsonProperty("Type")]
        public string Type { get; set; }
    }
}

编辑:

或尝试使用:

JsonConvert.DeserializeXmlNode<>
JsonConvert.DeserializeXNode<>

代替:

JsonConvert.DeserializeObject<>

日志和错误列表不会在 iOS 和 Android 上直接告诉您,并且由于我在网上找不到类似的问题,所以我会把它留给以后的人。如果您使用 Xamarin Forms 并在单独的解决方案中引用 Class 库项目,请注意,如果您收到错误的反映或与上述类似的错误,问题的原因可能是 Mono[=12= 之间不兼容] 9 和 NetCore 2.1。在我的案例中,解决此问题的方法是对数据库任务使用单独的解决方案 NetCore 2.1 版本,并在相同的 XF 解决方案中添加相同的 Class 库项目,然后将其转换为以相同的 NetStandard 框架为目标,因为这就是 Xamarin表格旨在定位。