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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
580
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
Redmine 7.0 新機能・機能強化解説(OSC2026京都ダイジェスト版)
vividtone
1
210
20分でわかるセキュアAPI
nwiizo
1
200
ガバメント AI 源内を地方自治体は活用できるのか可能性と課題、期待について
takeda_h
1
370
グローバル基準のSREは、運用現場でどう機能したか:成熟度アセスメントの実践 / SRE NEXT 2026
sorawatanabe
0
140
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
310
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
【CEDEC2026】専門性の高いデフォルメチームが挑んだ人材育成戦略 〜Cygames Academiaの企画から実施まで〜
cygames
PRO
0
530
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
2.3k
LLM・AIエージェントシステムベストプラクティス
shibuiwilliam
2
590
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
6
1k
Forza Horizon 6 のテレメトリ機能で 自動運転に使えそうな学習データを集める話
henjin0
0
150
組織にどうSREを根付かせるか?〜IVRyの場合〜
abnoumaru
0
330
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
200
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
400
Done Done
chrislema
186
16k
How to build a perfect <img>
jonoalderson
1
5.9k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
460
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
360
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
640
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