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
1.1k
ViewFlipperで手軽にリッチアニメーション
tarumzu
0
610
Other Decks in Programming
See All in Programming
Google Apps Script で Ruby を動かす
kawahara
0
130
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
200
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
540
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
360
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.3k
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
390
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.5k
AIが無かった頃の素敵な出会いの話
codmoninc
1
360
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
350
What's New in Android 2026
veronikapj
0
240
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
560
FDEが実現するAI駆動経営の現在地
gonta
2
250
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
97
6.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
280
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
560
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
330
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
ご清聴、ありがとうございました!