私は、ASP.NET Web API(.NET 4.6.2)と呼ばれるバックエンド、Web APIクライアント実装PCL(別名ミドルウェア)、Xamarin.Formsプロジェクト(フロントエンド)を含むソリューションを作成しています。私のフロントエンドでJSONレスポンスを逆シリアル化しようとすると、私のWeb APIへの最近の変更の後、私は常にStackOverflowExceptionを取得します。特定の行は次のとおりです。JsonConvert.DeserializeObjectのStackOverflowException
result_ = JsonConvert.DeserializeObject<ObservableCollection<Employee>>(Encoding.UTF8.GetString(responseData_, 0, responseData_.Length));
私は、オーバーフローが発生するまでプログラムは2行の間にジャンプしていることがわかり、ここでデバッグしています:(ミドルウェアで)
EmployeesManager.cs
を(ミドルウェア)でprivate Image _image = new Image();
ImagesManager.cs
private Employee _employee = new Employee();
012 (ウェブ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プロジェクトを通じてウェブAPIクライアント実装を使用します。動作はすべてのプラットフォームで同じです。ただし、iOSとUWPだけがスタックオーバーフローを認識します。 Android上では、Web APIからデータを読み込んでいるときに例外なしでアプリが終了するだけです。
誰かがもっとコードを見たい場合は、要求されたコードを含む小さなパッケージを用意することができます。これらをすべてここに投稿すると、読みやすさが完全に損なわれます。
私はNewtonsoft Json.NET、Entity Framework 6、NSwag 6、Xamarin.Forms v2.3.2.127を使用します。
オブジェクトは相互に参照し、無限の再帰を引き起こします。シリアライザがこれらのプロパティを追跡しようとしないように、 '[JsonIgnore]'またはそれに類するもので1つ以上のナビゲーションプロパティを修飾する必要があるかもしれません。 – David
@zuckerthoben、どのようにテンプレートを生成しましたか? T4?あなたが私を助けることができると確信しています。[こちら](https://github.com/NSwag/NSwag/issues/553)を見てください。 – Shimmy
@Shimmyあなたの問題が解決されたことを知りました。私は自動統合を持っていないので、とにかく助けてくれませんでした。 Web APIがそれほど変わっていないので、私はそれを必要としません。 – zuckerthoben