Sto usando un database ef core nella mia app UWP e ho alcuni problemi di serializzazione di un elenco contenente un elenco con Newton JSON.
Per un esempio minimo considera il tutorial UWP di Microsoft con il seguente codice
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");
}
}
quando ora voglio serializzare alcuni dati nel seguente modo:
using (var db = new BloggingContext())
{
var dbPost = db.Blogs.Include(x => x.Post).ToList();
var serialized = JSONClass.Serialize(dbPost);
}
Ottengo un errore di tipo System.StackOverflowException
in mscorlib.ni.dll
che inserisco un ciclo infinito. Come utente alanh menzionato nei commenti, questo comportamento può essere risolto impostando ReferenceLoopHandling
su ReferenceLoopHandling.Ignore
in JsonSerializerSettings
.
Preferirei archiviare l' ID
di ogni post come List<int>
invece di List<Post>
durante la serializzazione del Blog.
Perché serializzare, se viene fornito un database? Voglio condividere voci specifiche del database e ho bisogno di serializzarle. Inoltre, ritengo che fare questo per la sincronizzazione con OneDrive
, quindi non c'è conflitto, quando si modificano voci di database diverse su dispositivi diversi in momenti diversi (utente singolo).
L'aggiunta di questa riga di codice nella classe Startup impedisce il problema del loop
services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
Quindi è possibile utilizzare l'attributo [JsonIgnore]
per tutte quelle proprietà che non si desidera serializzare.
Oppure puoi implementare il tuo serializzatore estendendo la classe JsonConverter
e implementando i tuoi WriteJson, ReadJson
e CanConvert
come mostrato qui: