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
830
CIサービス「Bitrise」を使って 最小限の労力でDanger + ktlintをGithubと連携させる
tarumzu
1
1.1k
JavaScriptでWebViewをハックする
tarumzu
2
1.5k
Realm Cloudを使ったオフラインファーストなアプリ開発
tarumzu
2
1.1k
ViewFlipperで手軽にリッチアニメーション
tarumzu
0
610
Other Decks in Programming
See All in Programming
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
7.7k
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
170
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
19k
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
1
1.9k
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
350
My Marp Sample
sinoue0108
0
110
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
220
リアルな遅延を測る仕様
kota_yata
1
120
バグを直したら useEffect が消えた
colorful12
3
700
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
110
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
250
Featured
See All Featured
The untapped power of vector embeddings
frankvandijk
2
1.8k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
810
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
480
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
310
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
400
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Done Done
chrislema
186
16k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
250
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Abbi's Birthday
coloredviolet
3
9.4k
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
ご清聴、ありがとうございました!