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:
<TargetFramework>netcoreapp2.1</TargetFramework>
- Microsoft.AspNetCore.App - v2.1.1
- Microsoft.NETCore.App - v2.1.0
- NETStandard.Library - v.2.0.3
- System.Configuration.ConfigurationManager - v5.0.0-preview.4.20251.6
- System.Data.SqlClient - v4.8.1
- System.Runtime - v4.3.1
XF.MyApp:
<TargetFramework>netstandard2.0</TargetFramework>
- Xamarin.Forms - v4.7.0.968
- Newtonsoft.Json - v12.0.3
- NETStandard.Library - v2.0.3
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表格旨在定位。
预期行为:
在 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:
<TargetFramework>netcoreapp2.1</TargetFramework>
- Microsoft.AspNetCore.App - v2.1.1
- Microsoft.NETCore.App - v2.1.0
- NETStandard.Library - v.2.0.3
- System.Configuration.ConfigurationManager - v5.0.0-preview.4.20251.6
- System.Data.SqlClient - v4.8.1
- System.Runtime - v4.3.1
XF.MyApp:
<TargetFramework>netstandard2.0</TargetFramework>
- Xamarin.Forms - v4.7.0.968
- Newtonsoft.Json - v12.0.3
- NETStandard.Library - v2.0.3
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表格旨在定位。