C# C#  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Файлы, потоки и сериализация

Разбирает владение потоками, буферы, асинхронное чтение и сериализацию JSON. Вопросы заставляют учитывать seekability, частичное чтение, лимиты, версии формата и безопасную замену файлов, а не надеяться на один удачный пример.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 30
Гарантирует ли Stream.Read заполнение всего запрошенного буфера?
C#
var read = stream.Read(buffer, 0, buffer.Length);
Process(buffer.AsSpan(0, read));
Вопрос 2 из 30
Что означает Read, вернувший 0?
Вопрос 3 из 30
Почему нельзя всегда присваивать stream.Position = 0?
C#
if (stream.CanSeek)
    stream.Position = 0;
else
    throw new NotSupportedException("A rewindable stream is required.");
Вопрос 4 из 30
Кто должен Dispose stream, переданный в метод?
Вопрос 5 из 30
Что делает CopyTo?
C#
source.Position = headerLength;
source.CopyTo(destination);
Вопрос 6 из 30
Почему ReadAsync полезен при медленном I/O?
C#
var count = await stream.ReadAsync(buffer, token);
await consumer.WriteAsync(buffer[..count], token);
Вопрос 7 из 30
Как читать поток до конца корректно?
C#
while (true)
{
    var read = await stream.ReadAsync(buffer, token);
    if (read == 0) break;
    await consumer.WriteAsync(buffer[..read], token);
}
Вопрос 8 из 30
Можно ли одновременно вызвать два ReadAsync на одном Stream?
Вопрос 9 из 30
Что нужно сделать перед возвратом арендованного write-буфера?
C#
var rented = pool.Rent(size);
try
{
    Fill(rented.AsSpan(0, size));
    await stream.WriteAsync(rented.AsMemory(0, size), token);
}
finally { pool.Return(rented); }
Вопрос 10 из 30
Что означает FlushAsync?
Вопрос 11 из 30
Почему сериализатор безопаснее ручной интерполяции JSON?
C#
var json = JsonSerializer.Serialize(new { Name = userInput });
Вопрос 12 из 30
Что делает PropertyNamingPolicy = JsonNamingPolicy.CamelCase?
C#
var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
var json = JsonSerializer.Serialize(new UserDto("Anna"), options);
Вопрос 13 из 30
Когда удобен JsonDocument/JsonElement?
Вопрос 14 из 30
Почему возвращённый JsonElement может стать недействительным?
C#
JsonElement Read(string json)
{
    using var doc = JsonDocument.Parse(json);
    return doc.RootElement.Clone();
}
Вопрос 15 из 30
Когда custom JsonConverter оправдан?
Вопрос 16 из 30
Какое изменение обычно наиболее совместимо назад?
C#
public sealed record OrderDocument(
    int SchemaVersion,
    Guid Id,
    string? Comment = null);
Вопрос 17 из 30
Зачем поле schemaVersion?
C#
return dto.SchemaVersion switch
{
    1 => MigrateV1(dto),
    2 => MapV2(dto),
    _ => throw new UnsupportedSchemaVersionException(dto.SchemaVersion)
};
Вопрос 18 из 30
Почему event-sourcing событие лучше не менять задним числом?
Вопрос 19 из 30
Как проверить обратную совместимость?
C#
[Theory]
[InlineData("fixtures/order-v1.json")]
[InlineData("fixtures/order-v2.json")]
public void Reads_historical_documents(string path) =>
    AssertValid(reader.Read(File.ReadAllText(path)));
Вопрос 20 из 30
Что означает tolerant reader?
Вопрос 21 из 30
Как проверить код на частичные чтения?
C#
using var source = new ChunkedReadStream(payload, maxChunk: 2);
var actual = await reader.ReadMessageAsync(source, token);
Assert.Equal(expected, actual);
Вопрос 22 из 30
Что проверяет тест полного цикла сериализации и чтения?
Вопрос 23 из 30
Как проверить освобождение stream при ошибке?
C#
var stream = new TrackingStream { ThrowOnRead = true };
await Assert.ThrowsAsync<IOException>(() => sut.ImportAsync(stream));
Assert.True(stream.IsDisposed); // если sut владеет stream по контракту
Вопрос 24 из 30
Какие метрики полезны для сериализации?
Вопрос 25 из 30
Что записать при повреждённом документе?
C#
log.LogWarning(ex,
    "Document {DocumentId} schema {SchemaVersion} is invalid at {Path}",
    id, version, ex.Path);
Вопрос 26 из 30
Когда streaming JSON лучше JsonSerializer.Deserialize большого массива?
C#
await foreach (var item in JsonSerializer.DeserializeAsyncEnumerable<OrderDto>(stream, cancellationToken: token))
{
    if (item is not null)
        await ProcessAsync(item, token);
}
Вопрос 27 из 30
Как безопасно заменить конфигурационный файл?
C#
var temp = path + ".tmp";
await File.WriteAllTextAsync(temp, json, token);
File.Move(temp, path, overwrite: true);
Вопрос 28 из 30
Почему входной размер нужно ограничить до десериализации?
Вопрос 29 из 30
Когда System.IO.Pipelines оправдан?
C#
while (true)
{
    var result = await reader.ReadAsync(token);
    var buffer = result.Buffer;
    while (TryReadFrame(ref buffer, out var frame)) Handle(frame);
    reader.AdvanceTo(buffer.Start, buffer.End);
    if (result.IsCompleted) break;
}
Вопрос 30 из 30
Как компрессия влияет на архитектуру?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу