【发布时间】:2017-02-20 04:00:34
【问题描述】:
我正在编写一个解决方案,其中包含一个 ASP.NET Web API (.NET 4.6.2) (即后端)、一个 Web API 客户端实现 PCL(即中间件)和 Xamarin.Forms 项目(即前端)。在最近对我的 web api 进行更改之后,当我尝试反序列化前端中的 JSON 响应时,我现在总是得到一个 StackOverflowException。具体线路为:
result_ = JsonConvert.DeserializeObject<ObservableCollection<Employee>>(Encoding.UTF8.GetString(responseData_, 0, responseData_.Length));
我在这里调试的时候,看到程序在两行之间跳转,直到发生溢出:
EmployeesManager.cs(在中间件中)
private Image _image = new Image();
ImagesManager.cs(在中间件中)
private Employee _employee = new Employee();
这里有更多代码:
模型(在 Web API 中):
public class Employee
{
public int Id { get; set; }
// OMITTED PROPS
public int? ImageId { get; set; }
public Image Image { get; set; }
public ICollection<Device> Devices { get; set; }
public int? TeamId { get; set; }
public Team Team { get; set; }
}
public class Image
{
[Key]
public int Id { get; set; }
[Required]
public byte[] Data { get; set; }
public int EmployeeId { get; set; }
public Employee Employee { get; set; }
}
客户端实现中的模型(中间件)。它们是用Nswag 生成的:
public partial class Employee : INotifyPropertyChanged
{
private int _id;
private int? _imageId;
private Image _image = new Image(); // THIS LINE IS PART OF THE OVERFLOW
private ObservableCollection<Device> _devices;
private int? _teamId;
private Team _team = new Team();
// OMITTED PROPS
[JsonProperty("image", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public Image Image
{
get { return _image; }
set
{
if (_image != value)
{
_image = value;
RaisePropertyChanged();
}
}
}
public partial class Image : INotifyPropertyChanged
{
private int _id;
private int _employeeId;
private Employee _employee = new Employee(); // THIS LINE IS PART OF THE STACK OVERFLOW
private byte[] _data;
// OMITTED PROPS
[JsonProperty("employee", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
public Employee Employee
{
get { return _employee; }
set
{
if (_employee != value)
{
_employee = value;
RaisePropertyChanged();
}
}
}
我通过 Xamarin.Forms 项目使用 Web API 客户端实现。所有平台上的行为都是相同的。不过,只有 iOS 和 UWP 能够识别 Stack Overflow。在 Android 上,当我从 Web API 读取数据时,应用程序会直接关闭而不会出现异常。
如果有人想查看更多代码,我可以准备一个包含请求代码的小包。将它们全部发布在这里会完全破坏可读性。
我使用 Newtonsoft Json.NET、Entity Framework 6、NSwag 6、Xamarin.Forms v2.3.2.127。
【问题讨论】:
-
对象相互引用,导致无限递归。您可能需要使用
[JsonIgnore]或类似的东西来装饰一个或多个导航属性,这样序列化程序就不会尝试遵循这些属性。 -
@zuckerthoben,您是如何生成模板的? T4?我相信你可以帮助我,请看this。
-
@Shimmy 我看到你的问题已经解决了。无论如何也帮不上忙,因为我没有自动集成。我不需要它,因为我的 Web API 变化不大。
标签: c# asp.net json asp.net-web-api