2017-02-15 15 views
1

私はUWPアプリケーションでefコアデータベースを使用しており、Newtonsoft JSONでリストを含むリストをシリアライズする際にいくつかの問題があります。最小限例えばNewtonsoft JSON list in serialize list

私は今、いくつかのデータを次のようにシリアライズしたい場合は、次のコード

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"); 
    } 
} 

microsoftからUWPチュートリアルを考えてみます。

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

を私はタイプのエラーが出ますSystem.StackOverflowExceptionmscorlib.ni.dllに入力すると無限ループになります。コメントに記載されているユーザーのアラインのように、ReferenceLoopHandlingReferenceLoopHandling.IgnoreJsonSerializerSettingsに設定することでこの現象を修正できます。

ブログをシリアル化するときにList<Post>の代わりにList<int>というだけで各ポストのIDを保存することをお勧めします。

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

+1

JsonSerializerSettings、referenceloophandling = HTTPを無視://www.newtonsoftを。 com/json/help/html/T_Newtonsoft_Json_ReferenceLoopHandling.htm – alanh

+1

うわー、私は 'JsonSerializerSettings'を試していましたが、' ReferenceLoopHandling.Serialize'を使っていました。だから私はすべてを連載することができます。 'PostId'を投稿のエイリアスとしてシリアライズする方法もありますか? – user3079834

+0

@ user3079834 - 最新のコメントで説明したように、新しい要件を説明するために質問を編集できますか? – dbc

答えて

1

スタートアップクラスにこのコード行を追加し、

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

は、その後、あなたがシリアル化する必要はありませんすべてのそれらの特性のため[JsonIgnore]属性を使用することができ、あなたのループ問題防ぐことができます。

それともJsonConverterクラスを拡張し、ここに示したように、あなた自身のWriteJson, ReadJsonCanConvert方法実装することで、独自のシリアライザを実装することができます

implement your own serializer

関連する問題