Browse Source

Replace gson with kotlinx.serialization for ktor framework (#4037)

Ilya Ryzhenkov 7 years ago
parent
commit
363e9992d8

+ 31 - 18
frameworks/Kotlin/ktor/pom.xml

@@ -13,13 +13,13 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <gson.version>2.8.5</gson.version>
         <hikaricp.version>3.2.0</hikaricp.version>
         <kotlin.version>1.2.60</kotlin.version>
         <ktor.version>0.9.4</ktor.version>
         <logback.version>1.2.3</logback.version>
         <mysql.version>5.1.46</mysql.version>
         <postgresql.version>42.2.2</postgresql.version>
+        <serialization.version>0.6.1</serialization.version>
     </properties>
 
     <dependencies>
@@ -33,6 +33,12 @@
             <artifactId>kotlin-reflect</artifactId>
             <version>${kotlin.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.jetbrains.kotlinx</groupId>
+            <artifactId>kotlinx-serialization-runtime</artifactId>
+            <version>${serialization.version}</version>
+        </dependency>
+        
         <dependency>
             <groupId>io.ktor</groupId>
             <artifactId>ktor-server-netty</artifactId>
@@ -53,11 +59,6 @@
             <artifactId>ktor-html-builder</artifactId>
             <version>${ktor.version}</version>
         </dependency>
-        <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-            <version>${gson.version}</version>
-        </dependency>
         <dependency>
             <groupId>com.zaxxer</groupId>
             <artifactId>HikariCP</artifactId>
@@ -114,6 +115,18 @@
                         </goals>
                     </execution>
                 </executions>
+                <configuration>
+                    <compilerPlugins>
+                        <plugin>kotlinx-serialization</plugin>
+                    </compilerPlugins>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.jetbrains.kotlinx</groupId>
+                        <artifactId>kotlinx-maven-serialization-plugin</artifactId>
+                        <version>${serialization.version}</version>
+                    </dependency>
+                </dependencies>
             </plugin>
             <plugin>
                 <artifactId>maven-jar-plugin</artifactId>
@@ -198,23 +211,23 @@
         <repository>
             <id>ktor-repo</id>
             <url>https://dl.bintray.com/kotlin/ktor</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
         </repository>
         <repository>
             <id>jcenter</id>
             <url>https://jcenter.bintray.com/</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-            <snapshots>
-                <enabled>false</enabled>
-            </snapshots>
+        </repository>
+        <repository>
+            <id>bintray-kotlin-kotlinx</id>
+            <name>bintray</name>
+            <url>https://kotlin.bintray.com/kotlinx</url>
         </repository>
     </repositories>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>bintray-kotlin-kotlinx-plugins</id>
+            <name>bintray-plugins</name>
+            <url>https://kotlin.bintray.com/kotlinx</url>
+        </pluginRepository>
+    </pluginRepositories>
 
 </project>

+ 18 - 11
frameworks/Kotlin/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt

@@ -1,6 +1,5 @@
 package org.jetbrains.ktor.benchmarks
 
-import com.google.gson.*
 import com.zaxxer.hikari.*
 import io.ktor.application.*
 import io.ktor.content.*
@@ -12,14 +11,22 @@ import io.ktor.routing.*
 import kotlinx.coroutines.experimental.*
 import kotlinx.coroutines.experimental.scheduling.*
 import kotlinx.html.*
+import kotlinx.serialization.*
+import kotlinx.serialization.json.*
 import java.util.concurrent.*
 
+@Serializable
 data class Message(val message: String = "Hello, World!")
+
+@Serializable
 data class World(val id: Int, var randomNumber: Int)
+
+@Serializable
 data class Fortune(val id: Int, var message: String)
 
 fun Application.main() {
-    val gson = GsonBuilder().create()
+    val worldSerializer = World.serializer()
+    val worldListSerializer = World.serializer().list
 
     val dbRows = 10000
     val poolSize = 48
@@ -36,7 +43,7 @@ fun Application.main() {
         }
 
         get("/json") {
-            call.respondText(gson.toJson(Message()), ContentType.Application.Json, HttpStatusCode.OK)
+            call.respondText(JSON.stringify(Message()), ContentType.Application.Json, HttpStatusCode.OK)
         }
 
         get("/db") {
@@ -59,10 +66,10 @@ fun Application.main() {
                 }
             }
 
-            call.respondText(gson.toJson(when (queries) {
-                null -> result.single()
-                else -> result
-            }), ContentType.Application.Json, HttpStatusCode.OK)
+            call.respondText(when (queries) {
+                null -> JSON.stringify(worldSerializer, result.single())
+                else -> JSON.stringify(worldListSerializer, result)
+            }, ContentType.Application.Json, HttpStatusCode.OK)
         }
 
         get("/fortunes") {
@@ -134,10 +141,10 @@ fun Application.main() {
                 }
             }
 
-            call.respondText(gson.toJson(when (queries) {
-                null -> result.single()
-                else -> result
-            }), ContentType.Application.Json, HttpStatusCode.OK)
+            call.respondText(when (queries) {
+                null -> JSON.stringify(worldSerializer, result.single())
+                else -> JSON.stringify(worldListSerializer, result)
+            }, ContentType.Application.Json, HttpStatusCode.OK)
         }
     }
 }