我正在編寫一個包含ASP.NET Web API(.NET 4.6.2)(即後端),Web API客戶端實現PCL(即中間件)和Xamarin.Forms項目(也稱爲前端)的解決方案。在我的web api最近發生的變化之後,當我嘗試反序列化我前端的JSON響應時,我總是得到一個StackOverflowException。具體線路爲:JsonConvert.DeserializeObject上的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認識到堆棧溢出。在Android上,當我從Web API讀取數據時,應用程序僅關閉而沒有異常。
如果有人想看更多的代碼,我可以準備一個包含所需代碼的小包。在這裏發佈它們會完全破壞可讀性。
我使用Newtonsoft Json.NET,Entity Framework 6,NSwag 6,Xamarin.Forms v2.3.2.127。
對象相互引用,導致無限遞歸。您可能需要使用'[JsonIgnore]'或某種特性修飾一個或多個導航屬性,以便序列化程序不會嘗試遵循這些屬性。 – David
@zuckerthoben,你是如何生成你的模板? T4?我相信你可以幫助我,請看看[this](https://github.com/NSwag/NSwag/issues/553)。 – Shimmy
@Shimmy我看到你的問題解決了。無論如何不能真正幫助,因爲我沒有自動集成。我不需要它,因爲我的Web API沒有那麼多改變。 – zuckerthoben