Upgrade to Pro — share decks privately, control downloads, hide ads and more …

XMLのObject Mapping

XMLのObject Mapping

XMLとかのObjectMapperを作るときの、3つのアプローチについて

kobito-kaba

June 21, 2018
Tweet

More Decks by kobito-kaba

Other Decks in Programming

Transcript

  1. { "name": "hoge", "sex": 0, "birthday": "19900530", "mail_address": "[email protected]" }

    struct User: Codable { let name: String let sex: Int let birthday: String let mail_address: String } JSON struct
  2. User - name uninitialized - age uninitialized - locale uninitialized

    <User> <name>Taro</name> <age>18</age> <locale>Japan</locale> </User> val user = User( )
  3. User - name ”Taro” - age uninitialized - locale uninitialized

    <User> <name>Taro</name> <age>18</age> <locale>Japan</locale> </User> user.name = “Taro”
  4. User - name ”Taro” - age 18 - locale uninitialized

    <User> <name>Taro</name> <age>18</age> <locale>Japan</locale> </User> user.age = 18
  5. User - name ”Taro” - age 18 - locale ”Japan”

    <User> <name>Taro</name> <age>18</age> <locale>Japan</locale> </User> user.locale = “Japan”
  6. User - name ”Taro” - age 18 - locale ”Japan”

    User - name uninitialized - age uninitialized - locale uninitialized
  7. data class User(val name : String, val age : Int,

    val locale : String) コンストラクタ
  8. data class User(val name : String, val age : Int,

    val locale : String) コンストラクタ イミュータブル
  9. data class User(val name : String, val age : Int,

    val locale : String) コンストラクタ イミュータブル 非null
  10. User - name ”Taro” - age 18 - locale ”Japan”

    User - name uninitialized - age uninitialized - locale uninitialized
  11. User - name ”Taro” - age 18 - locale ”Japan”

    User - name uninitialized - age uninitialized - locale uninitialized 空のコンストラクタ無い
  12. User - name ”Taro” - age 18 - locale ”Japan”

    User - name uninitialized - age uninitialized - locale uninitialized イミュータブル 空のコンストラクタ無い
  13. User - name ”Taro” - age 18 - locale ”Japan”

    User - name uninitialized - age uninitialized - locale uninitialized イミュータブル 空のコンストラクタ無い 非null
  14. User - name ”Taro” - age 18 - locale ”Japan”

    User - name uninitialized - age uninitialized - locale uninitialized イミュータブル 空のコンストラクタ無い 非null 考え方が合わない
  15. data class User(var name : String?, var age : Int?,

    var locale : String?) ミュータブル
  16. data class User(var name : String?, var age : Int?,

    var locale : String?) ミュータブル nullable
  17. data class User(var name : String?, var age : Int?,

    var locale : String?) ミュータブル nullable 糞プロパティ 爆誕
  18. XML

  19. <Inbox> <name>受信箱</name> <Mails> <Mail> <title>主人がオオアリクイに…</title> <body>いきなりのメール失礼…</body> <User> <name>オオアリクイ</name> <address>[email protected]</address> </User>

    </Mail> … </Mails> </Inbox> data class Inbox( val name : String, val mails : List<Mail>) data class Mail( val title : String, val body : String, val from : User) data class User( val name : String, val address : String)
  20. <Inbox> <name>受信箱</name> <Mails> <Mail> <title>主人がオオアリクイに…</title> <body>いきなりのメール失礼…</body> <User> <name>オオアリクイ</name> <address>[email protected]</address> </User>

    </Mail> … </Mails> </Inbox> data class Inbox( val name : String, val mails : List<Mail>) data class Mail( val title : String, val body : String, val from : User) data class User( val name : String, val address : String) inline fun <reified T> fromXML(xml : InputStream) : T? { // ... }
  21. inline fun <reified T> fromXML(xml : InputStream) : T? {

    // ... } val inbox = fromXML<Inbox>(inpustStream)
  22. Mail - title : String - body : String -

    from : User User - name : String - address : String Inbox - name : String - mail : List<Mail>
  23. index オブジェクト プロパティ 値 1 Inbox - name 受信箱 -

    Mails [2] 2 Mail - title - body - User <Inbox> <name>受信箱</name> <Mails> <Mail> <title>主人がオオアリクイに…</title> <body>いきなりのメール失礼…</body> <User> <name>オオアリクイ</name> <address>[email protected]</address> </User> </Mail> … </Mails> </Inbox>
  24. index オブジェクト プロパティ 値 1 Inbox - name 受信箱 -

    Mails [2] 2 Mail - title - body - User <Inbox> <name>受信箱</name> <Mails> <Mail> <title>主人がオオアリクイに…</title> <body>いきなりのメール失礼…</body> <User> <name>オオアリクイ</name> <address>[email protected]</address> </User> </Mail> … </Mails> </Inbox>
  25. <Inbox> <name>受信箱</name> <Mails> <Mail> <title>主人がオオアリクイに…</title> <body>いきなりのメール失礼…</body> <User> <name>オオアリクイ</name> <address>[email protected]</address> </User>

    </Mail> … </Mails> </Inbox> index オブジェクト プロパティ 値 1 Inbox - name 受信箱 - Mails [2] 2 Mail - title 主人がオオアリクイに … - body いきなりのメール失礼 … - User 3 3 User - name - address
  26. <Inbox> <name>受信箱</name> <Mails> <Mail> <title>主人がオオアリクイに…</title> <body>いきなりのメール失礼…</body> <User> <name>オオアリクイ</name> <address>[email protected]</address> </User>

    </Mail> … </Mails> </Inbox> index オブジェクト プロパティ 値 1 Inbox - name 受信箱 - Mails [2] 2 Mail - title 主人がオオアリクイに … - body いきなりのメール失礼 … - User 3 3 User - name - address
  27. <Inbox> <name>受信箱</name> <Mails> <Mail> <title>主人がオオアリクイに…</title> <body>いきなりのメール失礼…</body> <User> <name>オオアリクイ</name> <address>[email protected]</address> </User>

    </Mail> … </Mails> </Inbox> index オブジェクト プロパティ 値 1 Inbox - name 受信箱 - Mails [2] 2 Mail - title 主人がオオアリクイに … - body いきなりのメール失礼 … - User 3 3 User - name オオアリクイ - address [email protected]
  28. <Inbox> <name>受信箱</name> <Mails> <Mail> <title>主人がオオアリクイに…</title> <body>いきなりのメール失礼…</body> <User> <name>オオアリクイ</name> <address>[email protected]</address> </User>

    </Mail> … </Mails> </Inbox> index オブジェクト プロパティ 値 1 Inbox - name 受信箱 - Mails [2, 4, 6, ...] 2 Mail - title 主人がオオアリクイに … - body いきなりのメール失礼 … - User 3 3 User - name オオアリクイ - address [email protected] 4 Mail - title 私はチンパンジーです。 - body はじめまして。早苗と …
  29. Mail - title : String - body : String -

    from : User User - name : String - address : String Inbox - name : String - mail : List<Mail>
  30. inline fun <reified T> xmlAdapter( ) : XMLAdapter<T?> { //

    ... } interface XMLAdapter<T> { fun fromXml() : T? }
  31. data class Inbox( val name : String, val mails :

    List<Mail>) data class Mail( val title : String, val body : String, val from : User) data class User( val name : String, val address : String)
  32. @XmlClass data class Inbox( val name : String, val mails

    : List<Mail>) @XmlClass data class Mail( val title : String, val body : String, val from : User) @XmlClass data class User( val name : String, val address : String)
  33. @XmlClass data class Inbox( val name : String, val mails

    : List<Mail>) @XmlClass data class Mail( val title : String, val body : String, val from : User) @XmlClass data class User( val name : String, val address : String) class Inbox_XmlAdapter : XmlAdapter<Inbox> class Mail_XmlAdapter : XmlAdapter<Mail> class User_XmlAdapter : XmlAdapter<User>
  34. inline fun <reified T> xmlAdapter( ) : XMLAdapter<T?> { return

    Class.forName(“${T::class.name}_XmlAdapter”).newInstance() }
  35. val adapter = xmlAdapter<Inbox>() val inbox = adapter.fromXml(inputStream) inline fun

    <reified T> xmlAdapter( ) : XMLAdapter<T?> { return Class.forName(“${T::class.name}_XmlAdapter”).newInstance() }
  36. APT

  37. inline fun <reified T> xmlAdapter( ) : XMLAdapter<T?> { return

    when(T::class) { Inbox::class -> Inbox_XmlAdapter() Mail::class -> Mail_XmlAdapter() ... } }