2016-09-09 4 views
2

Я не могу найти способ сериализации с JSON.NET списком производных списков, и я начинаю задаваться вопросом, возможно ли это. Позвольте мне объяснить ситуацию с помощью некоторого кода.Сериализовать список производного списка

Я создал новый класс, который получен из списка конкретного объекта (попытался первым с родовыми один) и добавил строковое свойство NomGroupe:

public class GroupeActes : List<Acte> 
{ 
    public string NomGroupe { get; set; } 

    public GroupeActes(string nom, List<Acte> liste) 
    { 
     NomGroupe = nom; 

     foreach (var acte in liste) 
     { 
      this.Add(acte); 
     } 
    } 
} 

Тогда, в моем коде, я 'объявлен список этого класса (List<GroupeActes> listOfGroupeActes), и я заполняю его данными. Для сериализации, я использую этот код:

 JsonSerializer serializer = new JsonSerializer(); 
     serializer.TypeNameHandling = TypeNameHandling.All; 
     using (StreamWriter sw = new StreamWriter(@"listOfGroupeActes.json")) 
     using (JsonWriter writer = new JsonTextWriter(sw)) 
     { 
      serializer.Serialize(writer, listOfGroupeActes); 
     } 

Я попытался с и без параметра TypeNameHandling.All и с несколькими сочетанием свойств Json.NET и даже с DataContract/DataMember.

До сих пор мне удалось получить в своем json-файле либо данные каждого вложенного List<Acte> без свойства NomGroupe, либо наоборот. Но не то и другое, что я хотел бы иметь.

Два вопроса затем:

  • Является ли это вообще возможно?
  • Если да, то как я могу это сделать?

Благодарим за помощь!

+0

Можете ли вы использовать JsonConvert.SerializeObject()? – gmn

+0

Нет, проблема такая же печальна. Свойство «NomGroupe» затем игнорируется. – LaPointe

+0

Похоже, что дубликат [JSON сериализует свойства в списке наследования классов] (https://stackoverflow.com/questions/35439335) и/или [Как мне получить json.net для сериализации членов класса, полученных из списка ? ] (https://stackoverflow.com/questions/21265629), оба из которых имеют обходные пути. – dbc

ответ

1

You don't want to inherit from List<T>.

Создать свойство списка вместо:

public class GroupeActes 
{ 
    public List<Acte> Actes { get; set; } 

    public string NomGroupe { get; set; } 

    public GroupeActes(string nom, List<Acte> liste) 
    { 
     NomGroupe = nom; 

     Actes.AddRange(acte);   
    } 
} 

Списки (и другие типы коллекций) получают специальную обработку при сериализации. Вы не хотите публичные свойства типа коллекции (например, Capacity и Count) в своем выводе, поэтому свойство, добавленное через наследование, также не будет сериализовано.

Коллекция сериализации, как это:

if o is IEnumerable 
    foreach object s in o 
     serialize o 

Так сериализатор не будет даже смотреть на свойства вашего перечислимых в.

+0

К сожалению, мне нужно наследовать список для группировки в список в проекте Xamarin.Forms [link] (https://developer.xamarin.com/guides/xamarin-forms/user-interface/listview/customizing-list -появление/). Так вы говорите, что сериализация объекта, подобного этому с помощью JSON.NET, вообще невозможна? – LaPointe

+0

Связана ли ваша сериализация с отображением в списке? Если нет, используйте класс выше для сериализации и сопоставьте его с тем, который указан для вашего вопроса для отображения. – CodeCaster

+0

Я намерен использовать сериализацию только для хранения данных. Итак, да, если JSON.NET не может этого сделать, это решение, которое я бы использовал. Спасибо, я приму свой ответ. – LaPointe

0

Попробуйте использовать Newtonsoft Json.NET

string itemToSend = JsonConvert.SerializeObject(dataModel); 
+0

Нет, проблема такая же печальна. Свойство «NomGroupe» затем игнорируется. – LaPointe

Смежные вопросы