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

Сериализация и внешние данные

Тест посвящён недоверенным и меняющимся данным: сериализаторам, полиморфизму, неизвестным полям и совместимости версий. Вопросы требуют отделять успешный разбор формата от проверки смысла и безопасности полученного объекта.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 6 тематических шкал.
Вопрос 1 из 30
В «Generated serializer модели» выбрали решение: Проверять round-trip и конкретные договорённые имена, а не хрупкое полное сравнение строки без необходимости. Какова его реальная цена?
Вопрос 2 из 30
Зачем заданы стабильные `@SerialName`?
KotlinПолиморфизм · Стабильные теги подтипов
// Проследите фактическое выполнение без изменения кода.
@Serializable sealed interface Event
@Serializable @SerialName("created") data class Created(val id: String): Event
@Serializable @SerialName("deleted") data class Deleted(val id: String): Event
Вопрос 3 из 30
Что в семантике Kotlin или используемого API объясняет «Лишнее поле во входном JSON»?
KotlinНеизвестные поля данных · Лишнее поле во входном JSON
// На ревью требуется объяснить причину поведения.
val json = Json { ignoreUnknownKeys = true }
@Serializable data class User(val id: Int)
val user = json.decodeFromString<User>("""{"id":1,"name":"Ada"}""")
Вопрос 4 из 30
Что следует изменить прежде всего во фрагменте «Новое поле с default»?
KotlinВерсионирование · Новое поле с default
// Сохраните назначение фрагмента, но укрепите его контракт.
@Serializable
data class Profile(
    val id: String,
    val nickname: String = ""
)
Вопрос 5 из 30
Что проверить отдельно, чтобы не принять «Исторические JSON fixtures» за универсальное правило?
Вопрос 6 из 30
Что станет новой точкой внимания после изменения «DTO на внешней границе»: Не разделять один stateful Json-конфиг между недоверенными протоколами с разными модулями типов без явной политики?
Вопрос 7 из 30
Какой контракт определяет наблюдаемый результат «Стабильные теги подтипов»?
KotlinПолиморфизм · Стабильные теги подтипов
// На ревью требуется объяснить причину поведения.
@Serializable sealed interface Event
@Serializable @SerialName("created") data class Created(val id: String): Event
@Serializable @SerialName("deleted") data class Deleted(val id: String): Event
Вопрос 8 из 30
Как сделать ответственность во фрагменте «Лишнее поле во входном JSON» понятной следующему разработчику?
KotlinНеизвестные поля данных · Лишнее поле во входном JSON
// Сохраните назначение фрагмента, но укрепите его контракт.
val json = Json { ignoreUnknownKeys = true }
@Serializable data class User(val id: Int)
val user = json.decodeFromString<User>("""{"id":1,"name":"Ada"}""")
Вопрос 9 из 30
Где поведение «Новое поле с default» требует отдельной проверки?
Вопрос 10 из 30
Какую обратную сторону имеет решение для «Исторические JSON fixtures»: Хранить fixtures рядом с номером схемы и запускать их в CI при обновлении Kotlin, plugin и настроек Json?
Вопрос 11 из 30
Почему DTO отделён от доменной модели?
KotlinАрхитектура и конкурентность · DTO на внешней границе
// Проследите фактическое выполнение без изменения кода.
class UserGateway(private val json: Json, private val transport: Transport) {
    suspend fun load(): User = transport.get()
        .let { json.decodeFromString<UserDto>(it) }
        .validate()
        .toDomain()
}
Вопрос 12 из 30
Какой принцип важнее точного порядка полей в строке?
KotlinСериализаторы · Generated serializer модели
// Проследите фактическое выполнение без изменения кода.
@Serializable
data class User(val id: Long, val name: String)

val json = Json.encodeToString(User(1, "Ada"))
Вопрос 13 из 30
Какой тест лучше всего защищает край контракта «Лишнее поле во входном JSON»?
Вопрос 14 из 30
Команда собирается хранить версию или явный мигратор для долговременных данных и тестировать чтение fixtures всех поддерживаемых версий. Что придётся учитывать после внедрения в «Новое поле с default»?
Вопрос 15 из 30
Какой набор regression fixtures полезнее всего?
KotlinТестирование и инструменты · Исторические JSON fixtures
// Проследите фактическое выполнение без изменения кода.
val old = """{"id":"u1"}"""
val current = Json.decodeFromString<Profile>(old)
Вопрос 16 из 30
Какое утверждение точнее всего объясняет поведение фрагмента «DTO на внешней границе»?
KotlinАрхитектура и конкурентность · DTO на внешней границе
// На ревью требуется объяснить причину поведения.
class UserGateway(private val json: Json, private val transport: Transport) {
    suspend fun load(): User = transport.get()
        .let { json.decodeFromString<UserDto>(it) }
        .validate()
        .toDomain()
}
Вопрос 17 из 30
Какой контракт определяет наблюдаемый результат «Generated serializer модели»?
KotlinСериализаторы · Generated serializer модели
// На ревью требуется объяснить причину поведения.
@Serializable
data class User(val id: Long, val name: String)

val json = Json.encodeToString(User(1, "Ada"))
Вопрос 18 из 30
Какое изменение лучше всего защищает границу «Стабильные теги подтипов»?
KotlinПолиморфизм · Стабильные теги подтипов
// Сохраните назначение фрагмента, но укрепите его контракт.
@Serializable sealed interface Event
@Serializable @SerialName("created") data class Created(val id: String): Event
@Serializable @SerialName("deleted") data class Deleted(val id: String): Event
Вопрос 19 из 30
Почему default у нового поля помогает читать старые документы?
KotlinВерсионирование · Новое поле с default
// Проследите фактическое выполнение без изменения кода.
@Serializable
data class Profile(
    val id: String,
    val nickname: String = ""
)
Вопрос 20 из 30
Почему поведение «Исторические JSON fixtures» не является случайностью?
KotlinТестирование и инструменты · Исторические JSON fixtures
// На ревью требуется объяснить причину поведения.
val old = """{"id":"u1"}"""
val current = Json.decodeFromString<Profile>(old)
Вопрос 21 из 30
Какая правка устраняет причину риска в «DTO на внешней границе», а не только его проявление?
KotlinАрхитектура и конкурентность · DTO на внешней границе
// Сохраните назначение фрагмента, но укрепите его контракт.
class UserGateway(private val json: Json, private val transport: Transport) {
    suspend fun load(): User = transport.get()
        .let { json.decodeFromString<UserDto>(it) }
        .validate()
        .toDomain()
}
Вопрос 22 из 30
Как укрепить «Generated serializer модели», не переписывая соседние модули?
KotlinСериализаторы · Generated serializer модели
// Сохраните назначение фрагмента, но укрепите его контракт.
@Serializable
data class User(val id: Long, val name: String)

val json = Json.encodeToString(User(1, "Ada"))
Вопрос 23 из 30
Какой сценарий выявит скрытое ограничение «Стабильные теги подтипов»?
Вопрос 24 из 30
Решение для «Лишнее поле во входном JSON»: Включать толерантность осознанно, вести наблюдение за новыми полями и отдельно валидировать данные, которые влияют на безопасность. Что в нём остаётся не бесплатным?
Вопрос 25 из 30
Что следует изменить прежде всего во фрагменте «Исторические JSON fixtures»?
KotlinТестирование и инструменты · Исторические JSON fixtures
// Сохраните назначение фрагмента, но укрепите его контракт.
val old = """{"id":"u1"}"""
val current = Json.decodeFromString<Profile>(old)
Вопрос 26 из 30
Какой редкий случай способен сломать наивную трактовку «DTO на внешней границе»?
Вопрос 27 из 30
Какой контрпример точнее всего показывает границу «Generated serializer модели»?
Вопрос 28 из 30
Какой риск не исчезает после правки «Стабильные теги подтипов»: Назначить короткие стабильные теги, протестировать неизвестный подтип и не использовать обфусцируемое имя класса как протокол?
Вопрос 29 из 30
Что произойдёт?
KotlinНеизвестные поля данных · Лишнее поле во входном JSON
// Проследите фактическое выполнение без изменения кода.
val json = Json { ignoreUnknownKeys = true }
@Serializable data class User(val id: Int)
val user = json.decodeFromString<User>("""{"id":1,"name":"Ada"}""")
Вопрос 30 из 30
На какой контракт языка или библиотеки опирается «Новое поле с default»?
KotlinВерсионирование · Новое поле с default
// На ревью требуется объяснить причину поведения.
@Serializable
data class Profile(
    val id: String,
    val nickname: String = ""
)

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

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

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

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