Newtonsoft JSONシリアル化リストのリスト

entity-framework-core json.net serialization uwp

質問

私は私のUWPアプリでefコアデータベースを使用していて、Newtonsoft JSONでリストを含むリストをシリアライズするいくつかの問題があります。

最小限の例として、次のコードを使用してMicrosoftのUWPチュートリアルを検討してください。

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Post { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Filename=minexample.db");
    }
}

次のようにデータをシリアル化したい場合

using (var db = new BloggingContext())
{
    var dbPost = db.Blogs.Include(x => x.Post).ToList();
    var serialized = JSONClass.Serialize(dbPost);
}

無限ループに入るというmscorlib.ni.dll System.StackOverflowExceptionタイプのエラーが発生します。ユーザーがコメントで述べたように、この動作はJsonSerializerSettings ReferenceLoopHandlingReferenceLoopHandling.Ignoreに設定することで修正できます。

ブログをシリアル化するときには、各投稿のIDList<Post>ではなくList<int>として格納することをお勧めします。

データベースが指定されているのに、なぜ直列化するのですか?特定のデータベースエントリを共有し、それらをシリアル化する必要があります。また、私はこれをOneDriveとの同期のために行うことを検討しているので、異なるデバイス上の異なるデータベースエントリを異なる時間に編集するとき(シングルユーザー)に衝突はありません。

人気のある回答

このコード行をStartupクラスに追加すると、ループの問題を回避できます

 services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

そうすれば、シリアル化したくないプロパティすべてに[JsonIgnore]属性を使用できます。

あるいは、 JsonConverterクラスを拡張し、 JsonConverterように独自のWriteJson, ReadJson 、およびCanConvertメソッドを実装することで、独自のシリアライザを実装することもできます。

あなた自身のシリアライザを実装する



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ