1 package kotlinx.serialization.json.internal
2
3 import kotlinx.serialization.*
4 import kotlinx.serialization.json.DecodeSequenceMode
5 import kotlinx.serialization.json.Json
6
7 @RequiresOptIn(level = RequiresOptIn.Level.ERROR)
8 internal annotation class JsonFriendModuleApi
9
10 @JsonFriendModuleApi
11 public interface InternalJsonWriter {
writeLongnull12 public fun writeLong(value: Long)
13 public fun writeChar(char: Char)
14 public fun write(text: String)
15 public fun writeQuoted(text: String)
16 public fun release()
17 }
18
19 @JsonFriendModuleApi
20 public interface InternalJsonReader {
21 public fun read(buffer: CharArray, bufferOffset: Int, count: Int): Int
22 }
23
24 @JsonFriendModuleApi
encodeByWriternull25 public fun <T> encodeByWriter(json: Json, writer: InternalJsonWriter, serializer: SerializationStrategy<T>, value: T) {
26 val encoder = StreamingJsonEncoder(
27 writer, json,
28 WriteMode.OBJ,
29 arrayOfNulls(WriteMode.entries.size)
30 )
31 encoder.encodeSerializableValue(serializer, value)
32 }
33
34 @JsonFriendModuleApi
decodeByReadernull35 public fun <T> decodeByReader(
36 json: Json,
37 deserializer: DeserializationStrategy<T>,
38 reader: InternalJsonReader
39 ): T {
40 val lexer = ReaderJsonLexer(reader)
41 try {
42 val input = StreamingJsonDecoder(json, WriteMode.OBJ, lexer, deserializer.descriptor, null)
43 val result = input.decodeSerializableValue(deserializer)
44 lexer.expectEof()
45 return result
46 } finally {
47 lexer.release()
48 }
49 }
50
51 @JsonFriendModuleApi
52 @ExperimentalSerializationApi
decodeToSequenceByReadernull53 public fun <T> decodeToSequenceByReader(
54 json: Json,
55 reader: InternalJsonReader,
56 deserializer: DeserializationStrategy<T>,
57 format: DecodeSequenceMode = DecodeSequenceMode.AUTO_DETECT
58 ): Sequence<T> {
59 val lexer = ReaderJsonLexer(reader, CharArray(BATCH_SIZE)) // Unpooled buffer due to lazy nature of sequence
60 val iter = JsonIterator(format, json, lexer, deserializer)
61 return Sequence { iter }.constrainOnce()
62 }
63
64 @JsonFriendModuleApi
65 @ExperimentalSerializationApi
decodeToSequenceByReadernull66 public inline fun <reified T> decodeToSequenceByReader(
67 json: Json,
68 reader: InternalJsonReader,
69 format: DecodeSequenceMode = DecodeSequenceMode.AUTO_DETECT
70 ): Sequence<T> = decodeToSequenceByReader(json, reader, json.serializersModule.serializer(), format)
71