Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin serializationの使い方を詳しく調べてみた
Search
Wataru Mizukami
January 21, 2019
Programming
1.7k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kotlin serializationの使い方を詳しく調べてみた
Wataru Mizukami
January 21, 2019
More Decks by Wataru Mizukami
See All by Wataru Mizukami
GitHub Actions活用術
tarumzu
1
820
CIサービス「Bitrise」を使って 最小限の労力でDanger + ktlintをGithubと連携させる
tarumzu
1
1.1k
JavaScriptでWebViewをハックする
tarumzu
2
1.5k
Realm Cloudを使ったオフラインファーストなアプリ開発
tarumzu
2
1k
ViewFlipperで手軽にリッチアニメーション
tarumzu
0
610
Other Decks in Programming
See All in Programming
権限チェックの一貫性を型で守る TypeScript による多層防御
mnch
4
1.1k
New "Type" system on PicoRuby
pocke
1
470
RTSPクライアントを自作してみた話
simotin13
0
490
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
4.2k
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
1.5k
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
440
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
1.4k
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
270
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.1k
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
450
net-httpのHTTP/2対応について
naruse
0
440
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.7k
Featured
See All Featured
Unsuck your backbone
ammeep
672
58k
My Coaching Mixtape
mlcsv
0
140
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
460
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
200
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
150
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
190
Statistics for Hackers
jakevdp
799
230k
For a Future-Friendly Web
brad_frost
183
10k
Leo the Paperboy
mayatellez
7
1.8k
Transcript
Kotlin serializationの使い方を詳しく 調べてみた Wataru Mizukami(水上 亘)
自己紹介 Wataru Mizukami/水上 亘 Twitter/Github/Qiita: @tarumzu (たる) Organization/所属: sikmi, inc.
Kotlin serializationとは - シリアライザ・デシリアライザである(コード自動生成用のコンパイラプラグインとシリ アライズ用のランタイムライブラリの構成) - JSON, CBOR, Protobufの3つのフォーマットをサポートし、 さらに有志が作成したアドオンを使えばHOCON,
YAMLも使える https://github.com/Kotlin/kotlinx.serialization/blob/master/formats/README.md - Kotlin/JVM, Kotlin/JS, Kotlin/Nativeプラットフォームをサポート - リフレクションを使用しない
Kotlin serializationとは - シリアライザ・デシリアライザである(コード自動生成用のコンパイラプラグインとシリ アライズ用のランタイムライブラリの構成) - JSON, CBOR, Protobufの3つのフォーマットをサポートし、 さらに有志が作成したアドオン使えばHOCON,
YAMLも使える https://github.com/Kotlin/kotlinx.serialization/blob/master/formats/README.md - Kotlin/JVM, Kotlin/JS, Kotlin/Nativeプラットフォームをサポート - リフレクションを使用しない ー> リフレクション使用しない分速い!
build.gradle Androidでの設定方法について記述する。その他のプラットフォーム用の設定は公式参照のこと buildscript { ext.kotlin_version = '1.3.11' repositories { jcenter()
} dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" } }
app/build.gradle apply plugin: 'kotlin' apply plugin: 'kotlinx-serialization' // 略 repositories
{ jcenter() // artifacts are published to this repository maven { url "https://kotlin.bintray.com/kotlinx" } } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.9.1" }
使い方 import kotlinx.serialization.* import kotlinx.serialization.json.JSON @Serializable data class Data(val a:
Int, @Optional val b: String = "42") fun main(args: Array<String>) { // Serializableアノテーションを付けた場合、オブジェクトを渡すだけ val jsonData = JSON.stringify(Data(42)) // コレクション等も拡張関数 serializerを使うことで利用可能 val jsonList = JSON.stringify(Data.serializer().list, listOf(Data(42))) println(jsonData) // {"a": 42, "b": "42"} println(jsonList) // [{"a": 42, "b": "42"}] // 文字列をパースするときも簡単! val obj = JSON.parse<Data>("""{"a":42}""") println(obj) // Data(a=42, b="42") } 引用元: https://github.com/Kotlin/kotlinx.serialization#quick-example
使い方2 @Serializable class Data(val a: Int) { private val b:
String = "42" override fun equals(other: Any?) = /*...*/ } // unquotedはフォーマットからダブルクォーテーションを外す assertEquals("{a:1, b:42}", JSON.unquoted.stringify(Data(1))) assertEquals(Data(1), JSON.unquoted.parse<Data>("{a:1, b:42}")) 引用元: https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/examples.md#supported-properties
アノテーションについて - Serializable : シリアライズしたいカスタムクラスに付けることでシリアライゼーションできる - Optional : 必須ではないパラメータの場合はオプショナルをつけないとエラーになる -
SerialName : JSONキー名が異なる場合に付ける - - Transient : JSONで扱わないプロパティを定義したい場合に使用する。 JSONにこのプロパティが存在していた場合エラーになる - SerialInfo : アノテーションクラスを定義するためのアノテーション。 プロパティにタグなどの情報をもたせることが出来て、 エンコーダー内でタグをもとに条件分岐などに利用できる。 Protobufなどで利用する
アノテーションの使い方 // シリアライズしたいクラスに付与 @Serializable data class Data( val a: Int,
// 必須パラメーターではない場合に付ける @Optional val b: String = “42”, // jsonキー名がcでプロパティ名とことなる場合 @SerialName("c") val d: String ) - SerialInfoの例は下記参照 https://github.com/Kotlin/kotlinx.serialization/blob/bb6e21e2c05cf6fa7d9a1b7f0c401d0afe726eda/runtime/com mon/src/test/kotlin/kotlinx/serialization/protobuf/SampleClasses.kt
カスタムシリアライザ シリアライザを自作することも可能。このサンプルは日付を扱う例 @Serializer(forClass = Date::class) object DateSerializer: KSerializer<Date> { private
val df: DateFormat = SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SSS") override val descriptor: SerialDescriptor = StringDescriptor.withName("WithCustomDefault") override fun serialize(output: Encoder, obj: Date) { output.encode(df.format(obj)) } override fun deserialize(input: Decoder): Date { return df.parse(input.decode()) } } 引用元: https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/custom_serializers.md#external-serializers-for-library-classes
ご清聴、ありがとうございました!