Json сериализация списка

169
14 апреля 2017, 19:22

Создал класс однонаправленного связного списка

public class List<T>
    where T : class, IComparable<T>
{
    /// <summary>
    /// Максимально допустимое количество элементво в хранилище
    /// </summary>
    private const int size = 10;
    /// <summary>
    /// Хранилище элементов
    /// </summary>
    protected readonly Element[] storage;
    /*методы для работы с элементами*/
    public void Upload()
    {
        var settings = new JsonSerializerSettings
        {
            PreserveReferencesHandling  = PreserveReferencesHandling.Objects,
            NullValueHandling           = NullValueHandling.Ignore,
            Formatting                  = Formatting.Indented
        };
        using (var writer = new StreamWriter(fileName, false))
            writer.WriteLine(
                JsonConvert.SerializeObject(this, settings));
    }
    protected class Element : BaseElement<T, int>
    { }
}
/// <summary>
/// Базовый класс для элементов структур данных
/// </summary>
/// <typeparam name="T">Тип данных информационной части</typeparam>
/// <typeparam name="N">Тип данных ссылки</typeparam>
public class BaseElement<T, N>
    where T : class
{
    /// <summary>
    /// Информационная часть элемента структуры данных
    /// </summary>
    public T Inf { get; set; }
    /// <summary>
    /// Ссылка на следующий элемент
    /// </summary>
    public N Next { get; set; }
}

Возникла проблема при сериализации созданного заполненного экземпляра. В файл записывается только значение одного из свойств(имеющее только get-ер). Подскажите, пожалуйста, как правильно реализовать сериализацию.

Answer 1

По умолчанию метод JsonConvert.SerializeObject сериализует все открытые экземплярные поля и свойства класса, именно по этой причине ваше поле storage, имеющее модификатор доступа protected не попадает в результирующий json-файл.

Это поведение сериализатора Json.NET можно изменить, установив для вашего класса атрибут

 [JsonObject(MemberSerialization.Fields)]

Теперь кроме public полей и свойств будут сериализованы все non-public (protected, internal, ...) поля и свойства.

Кстати, исключить ненужные для сериализации члены класса можно с помощью атрибутов [JsonIgnore] или [NonSerialized] (только для полей).

READ ALSO
Создать файл PDF

Создать файл PDF

Есть программа на WinForms которая в числе прочего формирует небольшой отчет в txt форматеС этим все просто, но возникла необходимость сохранять...

309
Как заставить объект вращаться по оси?

Как заставить объект вращаться по оси?

Всем приветЭтот код вращает мой объект по "y" оси

234
Как заставить IIS обрабатывать SOAPAction?

Как заставить IIS обрабатывать SOAPAction?

Работал работал себе SOAP под IIS 6 на NET 20, и спустя последнюю неделю начал выдавать такую ошибку (для запроса Soap 1

209
с# запрос на выборку из mysql

с# запрос на выборку из mysql

Есть запрос к БД:

192