我在我的UWP应用程序中使用了ef核心数据库,并且在序列化包含带有Newtonsoft JSON的列表的列表时出现了一些问题。
对于最小的示例,请考虑microsoft中的UWP教程,其中包含以下代码
with open (savethepaths,'w') as f:
f.writelines(list("%s\n" %filepath for filepath in filepaths))
当我现在想要通过以下方式序列化某些数据时:
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);
}
中收到System.StackOverflowException
类型的错误,我输入了无限循环。正如用户alanh在评论中提到的,可以通过在mscorlib.ni.dll
中将ReferenceLoopHandling
设置为ReferenceLoopHandling.Ignore
来解决此问题。
我希望在序列化博客时,只将每个帖子的JsonSerializerSettings
存储为ID
而不是List<int>
。
为什么要序列化,如果给出数据库?我想共享特定的数据库条目,需要序列化它们。此外,我考虑与List<Post>
进行同步,因此在不同时间(单个用户)在不同设备上编辑不同的数据库条目时不会发生冲突。
答案 0 :(得分:1)
将这行代码添加到Startup类中可以防止出现循环问题
services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
然后,您可以将[JsonIgnore]
属性用于您不希望序列化的所有属性。
或者您可以通过扩展JsonConverter
类并实施自己的WriteJson, ReadJson
和CanConvert
方法来实现自己的序列化程序,如下所示: