lewik
12/12/2017, 6:54 AMdata class Test(
val test: SomeInterface
)
elizarov
12/12/2017, 7:03 AMlewik
12/12/2017, 7:05 AMelizarov
12/12/2017, 8:32 AMlewik
12/12/2017, 8:33 AMinterface Test
@Serializable
data class A(var aa: String) : Test
@Serializable
data class B(var bb: String) : Test
@Serializable
data class container(
val test: Test
)
val container = container(
A("a") //Ошибка - пишет что нет сериализатора
)
val dd = dump(container)
elizarov
12/12/2017, 8:48 AMlewik
12/12/2017, 8:49 AMelizarov
12/12/2017, 8:49 AMsandwwraith
12/12/2017, 11:19 AMlewik
12/12/2017, 11:20 AMsnrostov
12/12/2017, 11:36 AMТ.е. есть будет записан массив, где первый элемент это строчка — имя класса, а второй элемент это собственно объект.Почему именно массив а не просто поле
@type
или @class
внутри json-объекта?sandwwraith
12/12/2017, 11:39 AMsnrostov
12/12/2017, 11:41 AM@type
. Просто реализация метода чтения внутренностей объекта вынесена а отдельный метод. Т.е. идет проверка, если первое поле @type
, то читаем тип, а далее вызываем метод readObjectRestContents
@type
должно быть первымCxJsonElementType.BEGIN_OBJECT -> readObject {
val nextKey = readNextKey(false)
when {
// string keyed map with first key escaped from keyword
nextKey.startsWith("$") -> stringKeyedMap(readDynamicStringKeyedMapContents(nextKey.substring(1), linker))
// reference, for example `{ "#class:field": "key value" }`
nextKey.startsWith("#") -> entityReference(readDynamicReference(nextKey, linker))
// keyword
nextKey.startsWith("@") -> {
val keyword = nextKey.substring(1)
when (keyword) {
"structure" -> {
val valueType = readType(linker)
structure(readJsonStructureContents(valueType as CxStructure<Any>, linker).instance)
}
"map" -> complexKeyedMap(readDynamicComplexKeyedMap(linker))
"class" -> inlineEntity(readInlineEntityTypeAndContents<Any>(linker).instance)
else -> error("unknown json @keyword: $nextKey, input: $this")
}
}
// string keyed map
else -> stringKeyedMap(readDynamicStringKeyedMapContents(nextKey, linker))
}
}