Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

5 лет назад
Открыть в
День 1108. #ЧтоНовенького Новинки System.Text.Json в .NET 6. Начало 1. Игнорирование циклических ссылок В .NET 5 при обнаружении циклических ссылок выдавалось исключение JsonException. В .NET 6 их можно игнорировать:
JsonSerializerOptions options = new()
{
  ReferenceHandler = ReferenceHandler.IgnoreCycles
};
string json = JsonSerializer.Serialize(myObj, options);

2. Уведомления при сериализации/десериализации Появилось 4 новых интерфейса, которые можно реализовать в соответствии с вашими потребностями: - IJsonOnDeserialized - IJsonOnDeserializing - IJsonOnSerialized - IJsonOnSerializing
class Product : IJsonOnDeserialized, IJsonOnSerializing
{
  public string Name { get; set; }
  public string Test { get; set; }

  void IJsonOnDeserialized.OnDeserialized()
    => Validate();
  void IJsonOnSerializing.OnSerializing()
    => Validate();

  private void Validate()
  {
    if (Name is null)
      throw new InvalidOperationException(
        "Name can't be null."
      );
  }
}

3. Порядок сериализации свойств Атрибут JsonPropertyOrder позволяет контролировать порядок сериализации свойств:
class Product
{
  // после Price
  [JsonPropertyOrder(2)]
  public string Category { get; set; }

  // после свойств с порядком по умолчанию
  [JsonPropertyOrder(1)]
  public decimal Price { get; set; }

  // порядок по умолчанию - 0
  public string Name { get; set; }

  // перед свойствами с порядком по умолчанию
  [JsonPropertyOrder(-1)]
  public int Id { get; set; }
}

Вывод:
{
  "Id": 1,
  "Name": "Surface Pro 7",
  "Price": 550,
  "Category": "Laptops"
}

4. Сериализация из/в поток В .NET 6 добавлены перегрузки синхронных методов Serialize/Deserialize для потоков:
// десериализация из потока
using MemoryStream ms = new MemoryStream(bytes);
MyClass ex = 
  JsonSerializer.Deserialize<MyClass>(ms);

// сериализация в поток
JsonSerializerOptions options = new() { 
  WriteIndented = true
};

using Stream output = Console.OpenStandardOutput();

MyClass ex = new() { Value = "Test" };
JsonSerializer.Serialize<MyClass>(output, ex, options);

Окончание следует… Источник: blog.okyrylchuk.dev/system-…dotnet-6