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
230
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
490
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
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
1
480
レガシーな広告配信システムでのAI駆動開発/運用の挑戦
i16fujimoto
0
120
フィジカル版Github Onshapeの紹介
shiba_8ro
0
320
SteampipeとExcel Power QueryでAWS構成定義書の作成を自動化する
jhashimoto
0
180
週末にループ・エンジニアリングの理解を深めるためのスライド
nagatsu
0
170
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
120
AIのReact習熟度を測る
uhyo
2
680
時期が悪い!それでもRaspberry Piを買って遊んで活用するには / 20260627-osc26do-rpi-jikigawarui
akkiesoft
0
800
飲食店もAIで。レジ締めやハンディシステムをつくってる話 / Using AI for restaurant management
vtryo
0
160
GitHub Copilot app最速の発信の裏側
tomokusaba
1
260
自宅LLMの話
jacopen
1
720
AIチャットの改善から見えた、良いAI体験とは / What Constitutes a Good AI Experience: Insights from Improving AI Chat
kubode
0
120
Featured
See All Featured
WENDY [Excerpt]
tessaabrams
11
38k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
Odyssey Design
rkendrick25
PRO
2
700
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
390
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
450
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
210
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
250
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
480
Building Applications with DynamoDB
mza
96
7.1k
Faster Mobile Websites
deanohume
310
32k
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