2017-02-15 9 views
1

Я использую базу данных ef core в своем приложении UWP и имею некоторые проблемы, связанные с сериализацией списка, содержащего список с Newtonsoft JSON.Newtonsoft JSON сериализует список в списке

Для минимального примера рассмотрит учебник UWP из microsoft со следующим кодом

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 в mscorlib.ni.dll, что я вхожу в бесконечный цикл. Как упоминалось в комментариях пользователя alanh, это поведение можно устранить установкой ReferenceLoopHandling до ReferenceLoopHandling.Ignore в JsonSerializerSettings.

Я бы предпочел, чтобы просто хранить ID каждого поста, как List<int> вместо List<Post> при сериализации блог.

Почему сериализация, если дана база данных? Я хочу поделиться конкретными записями базы данных и их сериализовать. Также я рассматриваю возможность сделать это для синхронизации с 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, ReadJson и CanConvert методы, как показано здесь:

implement your own serializer