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
RealmとJSONライブラリ
Search
zaki50
June 25, 2015
Technology
4.9k
14
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RealmとJSONライブラリ
zaki50
June 25, 2015
More Decks by zaki50
See All by zaki50
I/O Extended 2018 @Tokyo Android1
zaki50
3
1.3k
簡単高速なDIライブラリToothpick
zaki50
1
240
Android Studio 3.0 profilerハンズオン
zaki50
2
800
Realm Japan meetup #23_Java
zaki50
0
760
Realm Japan meetup #22_Java
zaki50
1
570
Realm World Tour Osaka Recent Java Updates
zaki50
0
500
Realm World Tour - ErrorProne in Realm Java
zaki50
2
500
Realm World Tour Tokyo Recent Java Updates
zaki50
2
810
Realm World Tour - ErrorProne in Realm Java
zaki50
1
790
Other Decks in Technology
See All in Technology
LLM/Agent評価:トップ営業の発言を「正解」にする 〜暗黙的正解による評価を営業資産に変える〜
takkuhiro
1
230
AIが実装を自走する時代の認知負債との戦い
lycorptech_jp
PRO
1
450
SRE Next 2026 何でも屋からの脱却
bto
0
1k
あなたの『Site』はどこですか? — xREという考え方
miyamu
0
1.2k
SREとQA 二人三脚で進めるSLO運用/sre-qa-slo
sugitak
0
1k
SRE本の知られざる名シーン / The Hidden Gems of Google SRE Book
nari_ex
1
430
複数プロダクト組織のAIネイティブ化における戦略 / AICon2026_kude
rakus_dev
0
110
ガバナンスの「ちょうどいい落とし所」を探れ!開発スピードを妨げない運用判断の勘所 / SRE NEXT 2026
genda
1
260
kaonavi Tech Night#1
kaonavi
0
110
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
280
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
1
250
OpenTelemetryにおけるGoのゼロコード・コンパイル時計装について #fukuokago
quiver
0
120
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
My Coaching Mixtape
mlcsv
0
170
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
900
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
We Have a Design System, Now What?
morganepeng
55
8.2k
Six Lessons from altMBA
skipperchong
29
4.3k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
220
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
GraphQLとの向き合い方2022年版
quramy
50
15k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
sira's awesome portfolio website redesign presentation
elsirapls
0
300
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Transcript
RealmͱJSONϥΠϒϥϦ 2015/6/25 Realm Meetup ࢁ㟒 (@zaki50)
ࣗݾհ • YAMAZAKI Makoto (@zaki50) • גࣜձࣾ uPhyca ॴଐ
ࠓͷ༰ • Realm ϞσϧΛ JSON ʹγϦΞϥΠζ͢Δ • Android(Java)Ͱ͢ • ϝδϟʔͳJSONϥΠϒϥϦͱRealmͷ૬ੑ
• ͦΕͧΕͷ͍ํ
JSONϥΠϒϥϦ • Moshi • Gson • Jackson • JsonPullParser
૬ੑʁ • RealmͷΦϒδΣΫτ͕POJOͰແ͍ ͜ͱʹىҼ͢Δ༷ʑͳ͕ى͜Δ
ϞσϧΫϥε(User) public class User extends RealmObject { private String
email; private String fullName; private Phone phone; public User() {} public User(String email, String fullName) { this.email = email; this.fullName = fullName; } // getterとsetterは省略 }
ϞσϧΫϥε(Phone) public class Phone extends RealmObject { private String
os; private String type; public Phone() {} public Phone(String os, String type) { this.os = os; this.type = type; } // getterとsetterは(ry }
Moshi • https://github.com/square/moshi • Squareࣾ • okioͱ࿈ܞͰ͖ΔͷͰɺOkHttpͱ͏ ͱޮ͕ྑ͍ • ޙड़ͷGsonͱࣅͨAPI
MoshiͰγϦΞϥΠζ User user = new User("
[email protected]
", "Makoto Yamazaki"); user(new Phone("Android",
"HT-03A")); Moshi moshi = new Moshi.Builder().build(); try { JsonAdapter<User> adapter = moshi.adapter(User.class); Log.d("json", adapter.toJson(user)); } catch (Exception e) { Log.d("json", "Moshi: error", e); }
࣮ߦ݁Ռ(Moshi) D/json (16011): java.lang.IllegalArgumentException: No JsonAdapter for java.lang.ref.WeakReference<io.realm.RealmChangeListener> annotated []
D/json (16011): at com.squareup.moshi.Moshi.createAdapter(Moshi.java:93) D/json (16011): at com.squareup.moshi.Moshi.adapter(Moshi.java:55) D/json (16011): at com.squareup.moshi.Moshi.adapter(Moshi.java:46)
ݪҼ public class User extends RealmObject { // 省略 }
RealmObject public abstract class RealmObject { protected Row row; protected
Realm realm; // 省略 } public final class Realm implements Closeable { // 省略 private List<WeakReference<RealmChangeListener>> changeListeners = ...; // 省略 }
݁(Moshi) • MoshiରΦϒδΣΫτͷશϑΟʔϧ υΛγϦΞϥΠζ͠Α͏ͱͯ͠͠·͏ɻ • আ֎ࢦఆ͕Ή͔͍ͣ͠ • Realmͱͷ૬ੑ ☓
Gson • https://github.com/google/gson • Googleࣾ • AndroidͷαϯϓϧͰΑ͘༻͞Εͯ ͍Δ • ϝδϟʔΏ͑ͷ҆৺ײ
• RealmެࣜαΠτͰݴٴ͞Ε͍ͯΔ
Realm ެࣜαΠτ https://realm.io/docs/java/latest/#gson
GsonͰγϦΞϥΠζ Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { @Override
public boolean shouldSkipField(FieldAttributes f) { return f.getDeclaringClass().equals(RealmObject.class); } @Override public boolean shouldSkipClass(Class<?> clazz) { return false; } }).create(); User user = new User("
[email protected]
", "Makoto Yamazaki"); user(new Phone("Android", "HT-03A")); Log.d("json", "Gson(stand alone): " + gson.toJson(user));
࣮ߦ݁Ռ(Gson) D/json (16011):Gson(stand alone): {"email":"
[email protected]
","fullName":"Makoto Yamazaki","phone":{"os":"Android","type":"HT-03A"}}
None
GsonͰγϦΞϥΠζ2 Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { //
省略 }).create(); User user = new User("
[email protected]
", "Makoto Yamazaki"); user(new Phone("Android", “HT-03A")); realm.beginTransaction(); { user = realm.copyToRealm(standAloneUser); } realm.commitTransaction(); Log.d("json", "Gson(managed): " + gson.toJson(user));
࣮ߦ݁Ռ2(Gson) D/json (16011):Gson(managed): {}
None
stand-alone vs managed • Stand-alone Object: σʔλϕʔεʹඥ ͍͍ͯͳ͍ΦϒδΣΫτɻgetter ෦ ͷprivateϑΟʔϧυ͔ΒΛฦ͢
• Managed Object: σʔλϕʔεʹඥ͍ ͍ͯΔΦϒδΣΫτɻgetterɺσʔλ ϕʔεʹ֨ೲ͞Ε͍ͯΔΛฦ͢
ݪҼ • GsongetterΛͬͯ͘Εͳ͍ʂ • RealmެࣜαΠτʹɺγϦΞϥΠζ͢ΔͳΒ ΧελϜͷTypeAdapterΛϞσϧΫϥε͝ͱʹ هड़͠Ζͱ͔͍ͯ͋Δ https://gist.github.com/cmelchior/ ddac8efd018123a1e53a
TypeAdapterͷྫ public class PersonSerializer implements JsonSerializer<Person> { @Override public JsonElement
serialize(Person src, Type typeOfSrc, JsonSerializationContext context) { final JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("name", src.getName()); jsonObject.addProperty("age", src.getAge()); jsonObject.add(“favoriteDog", context.serialize(src.getFavoriteDog())); jsonObject.add("dogs", context.serialize(src.getDogs())); return jsonObject; } }
݁(Gson) • Gsonඪ४Ͱgetter/setterΛΘͳ ͍ͷͰɺmanaged objectͰࠔΔ • શϞσϧΫϥεʹTypeAdapterॻ͘ͳ͍ ΒJsonObjectͰ࣮͢ΔͷͱมΘΒͳ͍ • Realmͱͷ૬ੑ˚
Jackson • http://wiki.fasterxml.com/ JacksonHome • ΘΓͱߴͳ͜ͱͰ༗໊ • JavaEEք۾Ͱͷ࣮͋Γɺαʔόʔ αΠυͰϝδϟʔ
JacksonͰγϦΞϥΠζ User user = new User("
[email protected]
", "Makoto Yamazaki"); user(new Phone("Android",
"HT-03A")); final ObjectMapper mapper = new ObjectMapper(); Log.d("json", "Jackson(stand alone): " + mapper.writeValueAsString(user)); realm.beginTransaction(); { user = realm.copyToRealm(standAloneUser); } realm.commitTransaction(); Log.d("json", "Jackson(managed): " + mapper.writeValueAsString(user));
࣮ߦ݁Ռ(Jsckson) D/json (16011): Jackson(stand alone): {"email":"
[email protected]
","fullName":"Makoto Yamazaki”,”phone": {"os":"Android","type":"HT-03A","valid":false}, "valid":false} D/json
(16011): Jackson(managed): {"email":"
[email protected]
","fullName":"Makoto Yamazaki","phone": {"os":"Android","type":"HT-03A","valid":true}," valid":true}
None
Μʁ
࣮ߦ݁Ռ(Jackson) D/json (16011): Jackson(stand alone): {"email":"
[email protected]
","fullName":"Makoto Yamazaki”,"phone": {"os":"Android","type":"HT-03A","valid":false}, "valid":false} D/json
(16011): Jackson(managed): {"email":"
[email protected]
","fullName":"Makoto Yamazaki","phone": {"os":"Android","type":"HT-03A","valid":true}," valid":true}
ݪҼ • JacksongetterΛͬͯ͘ΕΔ • ͔͠͠ɺΫϥεؚΊͯgetterͬΆ͍ϝιου ͕͋Δͱશ෦͏ public abstract class RealmObject
{ // 省略 public boolean isValid() { return row != null && row.isAttached(); } }
ରॲํ๏ @JsonIgnoreProperties({"valid"}) public class User extends RealmObject { private
String email; private String fullName; private Phone phone; // 省略 } • “valid”͕ͳΜͷ͜ͱ͔Θ͔Γʹ͍͘ • কདྷతʹRealmObjectʹϝιου͕૿͕͑ͨ࣌৺
݁(Jackson) • JacksongetterΛͬͯ͘ΕΔͷͰmanaged objectͰγϦΞϥΠζͰ͖Δ • ͔͠͠ɺRealmObject͕ͭgetterͬͯ͠· ͏ͨΊ༨ܭͳͷ͕ࠞೖ͢Δ • গ͠ͷखؒͰճආՄೳ͕ͩόʔδϣϯΞοϓ ͕৺
• Realmͱͷ૬ੑ ̋
JsonPullParser(JPP) • https://github.com/vvakame/JsonPullParser • TOPGATE͕ࣾތΔAndroidΤΩεύʔτvvakameࢯ࡞ • ͚ͬ͜͏ߴ • ݩʑPullParser͕ͩͬͨɺΦϒδΣΫτϚοϐϯά Ͱ͖Δ(ͱ͍͏͔ɺ΄΅ͦΕ͔͍ͬͯ͠ͳ͍)
JPPͰγϦΞϥΠζ User user = new User("
[email protected]
", "Makoto Yamazaki"); user(new Phone("Android",
"HT-03A")); StringWriter writer = new StringWriter(); UserGen.encode(writer, user); writer.close(); Log.d("json", "JPP(stand alone): " + writer.toString()); realm.beginTransaction(); user = realm.copyToRealm(standAloneUser); realm.commitTransaction(); writer = new StringWriter(); UserGen.encode(writer, user); writer.close(); Log.d("json", "JPP(managed): " + writer.toString());
ϞσϧΫϥε(User) @JsonModel public class User extends RealmObject { @JsonKey private
String email; @JsonKey private String fullName; @JsonKey private Phone phone; // 省略 }
ઃఆ͕ͪΐͬͱ໘ buildscript { ... dependencies { classpath 'com.android.tools.build:gradle:1.2.3' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
} } apply plugin: 'com.android.application' apply plugin: 'com.neenbedankt.android-apt' ... dependencies { ... compile ‘net.vvakame:jsonpullparser-core:1.6.2' apt ‘net.vvakame:jsonpullparser-apt:1.6.2' ... }
࣮ߦ݁Ռ(JPP) D/json (16011): JPP(stand alone): {"email":"
[email protected]
","fullName":"Makoto Yamazaki”,"phone": {"os":"Android","type":"HT-03A"}} D/json (16011):
JPP(managed): {"email":"
[email protected]
","fullName":"Makoto Yamazaki","phone": {"os":"Android","type":"HT-03A"}}
None
݁(JPP) • JPPgetterΛͬͯ͘ΕΔͷͰmanaged object ͰγϦΞϥΠζͰ͖Δ • ରͱ͢ΔϑΟʔϧυʹΞϊςʔγϣϯΛ͚ͭΔ ͷͰɺΒͳ͍͏ͪʹ༨ܭͳͷ͕ࠞೖ͠ͳ͍ • ϓϩδΣΫτઃఆ͕গ͚ͩ͠໘
• Realmͱͷ૬ੑ ̋
݁ Moshi<Gson<Jackson<JPP Realmͱͷ૬ੑͰ Έͳ͞ΜJPPΛ͍͖ͬͯ·͠ΐ͏ʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
αϯϓϧίʔυ https://github.com/zaki50/RealmMeetup4