~ fix serialization
diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/serizliation.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/serizliation.kt
index 4f1bbd4..b5f8a44 100644
--- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/serizliation.kt
+++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/serizliation.kt
@@ -17,118 +17,117 @@
     private val attribute = FileAttribute("kotlin-script-dependencies", 1, false)
 
     fun read(project: Project): List<KotlinDslScriptModel>? {
-        return attribute.readAttribute(project.projectFile ?: return null)?.use { readValue(it) }
+        return attribute.readAttribute(project.projectFile ?: return null)?.use { readKotlinDslScriptModels(it) }
     }
 
     fun write(project: Project, models: List<KotlinDslScriptModel>) {
         attribute.writeAttribute(project.projectFile ?: return).use {
-            writeValue(it, models)
+            writeKotlinDslScriptModels(it, models)
         }
     }
 }
 
-fun writeValue(output: DataOutputStream, value: List<KotlinDslScriptModel>) {
-    val strings = StringsPool()
+fun writeKotlinDslScriptModels(output: DataOutputStream, value: List<KotlinDslScriptModel>) {
+    val strings = StringsPool.writer(output)
     value.forEach {
-        strings.getStringId(it.file)
+        strings.addString(it.file)
         strings.addStrings(it.classPath)
         strings.addStrings(it.sourcePath)
         strings.addStrings(it.imports)
     }
-    strings.freeze()
-    strings.writeStrings(output)
-    value.forEach {
-        strings.writeStringId(it.file, output)
+    strings.writeHeader()
+    output.writeList(value) {
+        strings.writeStringId(it.file)
         output.writeString(it.inputs.sections)
         output.writeLong(it.inputs.inputsTS)
-        strings.writeStringIds(it.classPath, output)
-        strings.writeStringIds(it.sourcePath, output)
-        strings.writeStringIds(it.imports, output)
+        strings.writeStringIds(it.classPath)
+        strings.writeStringIds(it.sourcePath)
+        strings.writeStringIds(it.imports)
     }
 }
 
-fun readValue(input: DataInputStream): List<KotlinDslScriptModel> {
-    val strings = StringsPool()
-    strings.readStrings(input)
-    val n = input.readInt()
-    val result = mutableListOf<KotlinDslScriptModel>()
-    repeat(n) {
-        result.add(
-            KotlinDslScriptModel(
-                strings.readStringId(input),
-                GradleKotlinScriptConfigurationInputs(input.readString(), input.readLong()),
-                strings.readStringIds(input),
-                strings.readStringIds(input),
-                strings.readStringIds(input),
-                listOf()
-            )
+fun readKotlinDslScriptModels(input: DataInputStream): List<KotlinDslScriptModel> {
+    val strings = StringsPool.reader(input)
+    return input.readList {
+        KotlinDslScriptModel(
+            strings.readString(),
+            GradleKotlinScriptConfigurationInputs(input.readString(), input.readLong()),
+            strings.readStrings(),
+            strings.readStrings(),
+            strings.readStrings(),
+            listOf()
         )
     }
-    return result
 }
 
-private class StringsPool {
-    var freeze = false
-    val strings = mutableListOf<String>()
-    val ids = mutableMapOf<String, Int>()
+private object StringsPool {
+    fun writer(output: DataOutputStream) = Writer(output)
 
-    fun getString(id: Int) = strings[id]
+    class Writer(val output: DataOutputStream) {
+        var freeze = false
+        val ids = mutableMapOf<String, Int>()
 
-    fun getStringId(string: String): Int = ids.getOrPut(string) {
-        check(!freeze)
-        val id = strings.size
-        strings.add(string)
-        id
-    }
-
-    fun addString(string: String) {
-        getStringId(string)
-    }
-
-    fun addStrings(list: List<String>) {
-        list.forEach { getStringId(it) }
-    }
-
-    fun freeze() {
-        // sort for optimal performance and compression
-        strings.sort()
-        strings.forEachIndexed { index, s ->
-            ids[s] = index
+        fun getStringId(string: String) = ids.getOrPut(string) {
+            check(!freeze)
+            ids.size
         }
 
-        freeze = true
-    }
+        fun addString(string: String) {
+            getStringId(string)
+        }
 
-    fun writeStringIds(strings: List<String>, output: DataOutputStream) {
-        output.writeInt(strings.size)
-        strings.forEach {
-            writeStringId(it, output)
+        fun addStrings(list: List<String>) {
+            list.forEach { addString(it) }
+        }
+
+        fun writeHeader() {
+            freeze = true
+
+            output.writeInt(ids.size)
+
+            // sort for optimal performance and compression
+            ids.keys.sorted().forEachIndexed { index, s ->
+                ids[s] = index
+                output.writeString(s)
+            }
+        }
+
+        fun writeStringId(it: String) {
+            output.writeInt(getStringId(it))
+        }
+
+        fun writeStringIds(strings: List<String>) {
+            output.writeInt(strings.size)
+            strings.forEach {
+                writeStringId(it)
+            }
         }
     }
 
-    fun writeStringId(it: String, output: DataOutputStream) {
-        output.writeInt(getStringId(it))
+    fun reader(input: DataInputStream): Reader {
+        val strings = input.readList { input.readString() }
+        return Reader(input, strings)
     }
 
-    fun readStringIds(input: DataInputStream): List<String> {
-        val n = input.readInt()
-        val result = ArrayList<String>(n)
-        repeat(n) {
-            result.add(readStringId(input))
-        }
-        return result
-    }
+    class Reader(val input: DataInputStream, val strings: List<String>) {
+        fun getString(id: Int) = strings[id]
 
-    fun readStringId(input: DataInputStream) = getString(input.readInt())
+        fun readString() = getString(input.readInt())
 
-    fun writeStrings(output: DataOutputStream) {
-        output.writeInt(ids.size)
-        ids.keys.forEach { output.writeChars(it) }
+        fun readStrings(): List<String> = input.readList { readString() }
     }
+}
 
-    fun readStrings(input: DataInputStream) {
-        repeat(input.readInt()) {
-            ids[input.readString()] = ids.size
-        }
+private inline fun <T> DataOutputStream.writeList(list: List<T>, write: (T) -> Unit) {
+    writeInt(list.size)
+    list.forEach { write(it) }
+}
+
+private inline fun <T> DataInputStream.readList(read: () -> T): List<T> {
+    val n = readInt()
+    val result = ArrayList<T>(n)
+    repeat(n) {
+        result.add(read())
     }
+    return result
 }
\ No newline at end of file
diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/KotlinDslScriptModelsTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/KotlinDslScriptModelsTest.kt
index f14aadb..63fa21d 100644
--- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/KotlinDslScriptModelsTest.kt
+++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/scripting/gradle/KotlinDslScriptModelsTest.kt
@@ -5,14 +5,42 @@
 
 package org.jetbrains.kotlin.idea.scripting.gradle
 
+import org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslScriptModel
 import org.junit.Test
-
-import org.junit.Assert.*
+import java.io.ByteArrayInputStream
+import java.io.ByteArrayOutputStream
+import java.io.DataInputStream
+import java.io.DataOutputStream
+import kotlin.test.assertEquals
 
 class KotlinDslScriptModelsTest {
-
     @Test
-    fun read() {
-        write
+    fun write() {
+        val buffer = ByteArrayOutputStream()
+
+        val list = listOf(
+            KotlinDslScriptModel(
+                "a",
+                GradleKotlinScriptConfigurationInputs("b", 1),
+                listOf("c", "a", "b"),
+                listOf("b", "c", "a"),
+                listOf("i", "c", "b"),
+                listOf()
+            ),
+            KotlinDslScriptModel(
+                "a",
+                GradleKotlinScriptConfigurationInputs("b", 1),
+                listOf("c", "a", "b"),
+                listOf("b", "c", "a"),
+                listOf("i", "c", "b"),
+                listOf()
+            )
+        )
+
+        writeKotlinDslScriptModels(DataOutputStream(buffer), list)
+
+        val restored = readKotlinDslScriptModels(DataInputStream(ByteArrayInputStream(buffer.toByteArray())))
+
+        assertEquals(list.joinToString(), restored.joinToString())
     }
 }
\ No newline at end of file