ã·ãªã¢ã«åïŒä»¥éãä¿åãïŒã¯ãå€éšã¹ãã¬ãŒãžã«ãªããžã§ã¯ãããŒã¿ãä¿åããããã»ã¹ã§ãã
ãã®æäœã¯ãéæ¹åã®ããŒã¿å埩ãšãã¢ã«ãªã£ãŠããŸããããã¯ãéçŸå®åãšåŒã°ããŸãïŒä»¥éã®ãå埩ãã§ã¯Deserealize
ïŒã
ããŒã¿ã®ããã¯ã¢ããããã³ãªã«ããªæäœã¯éåžžã«é »ç¹ã«äœ¿çšãããŸãã å€å
žçãªããã°ã©ãã³ã°èšèªã§ã¯ããªããžã§ã¯ãã®ããŒã¿ãä¿åããã³åŸ©å
ããããã®æ¢è£œã®ã¡ã«ããºã ã¯ãããŸããããã®ãããªå¿
èŠãçããå Žåãèªåã§äœæããå¿
èŠããããŸãã
Javaã«ã¯ããã®ãããªæ¢è£œã®ã¡ã«ããºã ãååšããè€æ°ã®ã¡ã«ããºã ãååšããŸãã Kotlin
ããã°ã©ã ã«ã©ã®ãããªã¡ã«ããºã ããããã©ã®ãããªæ©äŒãããã°ã©ã ã«æäŸãããŠããããèŠãŠã¿ãŸãããã
ã·ãªã¢ã«åã®æŠå¿µã¯ãããŒã¿ãä¿åãããããŒã¿åœ¢åŒãšã¯ãŸã£ããé¢ä¿ããªããããçµæãäœã§ãã-ç¬èªã®æ§é ãæã€ãã€ããªãã¡ã€ã«ã XML
ã JSON
ãããã«ã¯ããã¹ããã¡ã€ã«-ãã¹ãŠãã·ãªã¢ã«åãããŸãã
é£èŒ
å€å
žçãªããã°ã©ãã³ã°èšèªã§ã¯ãæ§é åãªããžã§ã¯ããä¿åããããã®æ¢è£œã®ãªãã·ã§ã³ã¯ãããŸãããã ããŒã¿æ§é ã¯ã¡ã¢ãªã«çŽæ¥ãããããŒã¿ãçŽæ¥ä¿åããã³åŸ©å
ããç°¡åãªæ¹æ³ããããŸãã äžæ¹ã§ãçžäºæ¥ç¶ã䜿çšããŠè€éãªãªããžã§ã¯ããä¿åããå¿
èŠãããå Žåã«ã®ã¿ä¿åããç¬èªã®æ段ãäœæããå¿
èŠããããŸãããäžæ¹ã§ãããçš®ã®æãåçŽãªæ¢è£œã®ã¡ã«ããºã ã䜿çšããå Žåã§ãããã®åœ¢åŒã§ããŒã¿ãä¿åããå®è£
ã¯ããã¯ããªãé¢åãªäœæ¥ã§ãã
Javaã§ã¯ã1ã€ã®ãªããžã§ã¯ãã®èŠçŽ ã®ããŒã¿ã¯JVM
ã¡ã¢ãªãŒå
šäœã«ã©ã³ãã ã«åæ£ãããŠããããããªããžã§ã¯ãã®æ§é å
šäœãä¿åã§ãããšããŠããããŒã¿ãä¿åããããšã¯ã§ããŸããããããã£ãŠãJavaã§å¯èœãªå¯äžã®æ¹æ³ã¯ããªããžã§ã¯ããæ§æããåºæ¬åã®èŠçŽ ããšã®ããŒã¿ãæžã蟌ãããšã§ãã
äžæ¹ã§ãJavaã§ã®1ã€ã®æäœã§ãªããžã§ã¯ãå
šäœãä¿åããããšã¯ã§ããŸãããã RTTI
ã®éçºã®ãããã§ãä¿åçšã®æ¢è£œã®ããŒã«ã䜿çšããŠéåžžã«ç°¡åã«å®è£
ã§ããŸãã
Writer
ãPrintStream
ãªã©ã®å€ãã®ã¹ããªãŒã ã¯ã©ã¹ã¯ãåºæ¬ããŒã¿åãæ ŒçŽããããã®æ¢è£œã®æ©èœãæäŸããŸãããéåžžã«å€ãã®èšè¿°ãå¿
èŠãªããããããã䜿çšããããšã¯åŸæ¥ã®ããã°ã©ãã³ã°èšèªãšåæ§ã«äžäŸ¿ã§ãã
ãã ããJavaã«ã¯ãåºæ¬åã®åŠçã«å ããŠãã¯ã©ã¹ããŒã¿ãæ ŒçŽããããã®æ¢è£œã®ã¡ã«ããºã ãšãåã圢åŒã§åäœããå€ãã®ã©ã€ãã©ãªãããã€ããããããã©ãŒãã³ã¹ãããªã¥ãŒã ãæ©èœãç°ãªããŸãã
以äžã§ã¯ãããŒã¿ãä¿åããäžè¬çãªæ¹æ³ãæ€èšããŸããæšæºJavaã©ã€ãã©ãªãžã®çµã¿èŸŒã¿ãããã³XML
ããã³JSON
ä¿åJSON
ã
ã·ãªã¢ã©ã€ãºå¯èœ
æšæºJavaã©ã€ãã©ãªã«ååšããæãåçŽãªæ©èœã¯ããã€ããªåœ¢åŒã®å®å
šèªåã¢ãŒãã§ããŒã¿ãä¿åããã³åŸ©å
ããããšã§ãã ãã®æ©èœãå®è£
ããã«ã¯ãããŒã¿ãèªåçã«ä¿åããã³åŸ©å
ãããã¹ãŠã®ã¯ã©ã¹ãå®è£
ãããSerializableã€ã³ã¿ãŒãã§ã€ã¹ãæå®ããã ãã§ãã ããã¯ãã¡ãœããã®å®è£
ãå¿
èŠãšããªãããŒã«ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§ãã ãã®ã¯ã©ã¹ã®ããŒã¿ãããã¯ã¢ããããã³åŸ©å
ããå¿
èŠãããããšã瀺ãããã ãã«äœ¿çšãããŸãã
䜿çšäŸ
ãã®ã¯ã©ã¹ã®äœ¿çšã¯åºæ¬çã§ã-1ã€ã®æäœã§ã1ã€ã®äœåãªæåãæžãå¿
èŠã¯ãããŸããã
ããã°ã©ã ã³ãŒã class DataClass(s : String) : Serializable { @JvmField var strField = "" @JvmField var intField = 0 @JvmField var dbField = 0.0 protected @JvmField var strProt = "" private var strPriv = "" @JvmField val valStr : String protected @JvmField val valProt : String init { valStr = s valProt = "prot=" + s strField = s + ":baseText" intField = s.hashCode() dbField = s.hashCode().toDouble() / 1000 strProt = s+":prot" strPriv = s+":priv" } fun print() { outn("str = [%s]\nint = [%d]\ndb = [%f]", strField, intField, dbField) outn("prot = [%s]\npriv = [%s]", strProt, strPriv) outn("value = [%s]\nprot value = [%s]", valStr, valProt) } } fun Action() { outn( "Simple object IO test" ) val a = DataClass("dataA") outn("Saved contents:") a.print() Holder(ObjectOutputStream(File("out.bin").outputStream())).h.writeObject(a) val b = Holder(ObjectInputStream(File("out.bin").inputStream())).h.readObject() outn("Class: %s", b.javaClass.name) if (b is DataClass) { outn("Loaded contents:") b.print() } }
ãã®ãã¹ãã®çµæã次ã®åºåãåŸãããŸãã
çµæ Simple object IO test Saved contents: str = [dataA:baseText] int = [95356375] db = [95356,375000] prot = [dataA:prot] priv = [dataA:priv] value = [dataA] prot value = [prot=dataA] Class: app.test.Externalize.Test$DataClass Loaded contents: str = [dataA:baseText] int = [95356375] db = [95356,375000] prot = [dataA:prot] priv = [dataA:priv] value = [dataA] prot value = [prot=dataA]
ãã§ã«çµæãããããããã«ããªããžã§ã¯ãã®ä¿åãšåŸ©å
ã¯æåãã埩å
åŸãæ°ãããªããžã§ã¯ãã¯ä¿åããããªããžã§ã¯ããšãŸã£ããåãå
容ã«ãªããŸãã
ããã°ã©ã ãå®è¡ããããšããã¡ã€ã«ã out.bin
ãããã€ããªåœ¢åŒã§244ãã€ãã®ãµã€ãºã§äœæãããŸããã 圢åŒã®èª¬æã¯ããŸããŸãªãœãŒã¹ã§èŠã€ããããšãã§ããŸãããç§ã®æèŠã§ã¯ããããç解ããããšã¯æå³ããªããæ£åžžã«ä¿åããã³åŸ©å
ããã®ã«ååã§ãã
ç¹åŸŽ
äžèšã®äŸããã詳现ã«æ€èšãããšã次ã®æ©èœãèŠãããšãã§ããŸãã
- ã¢ã¯ã»ã¹ã¿ã€ã "
private
"ããã³ " protected
"ãæå®ãããŠãããã£ãŒã«ããå«ãããã¹ãŠã®ãã£ãŒã«ããä¿åããã³åŸ©å
ãããŸããã - ã
val
ããšç€ºããããã£ãŒã«ããåŠçãããŸããã Kotlin
æšæºã«ããäžå€ã§ãã - æ°ãããªããžã§ã¯ããäœæãããŸãããããã©ã¡ãŒã¿ãŒã®ãªãã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãªããæ¢åã®ãªããžã§ã¯ãã¯åŒã³åºãããŸããã§ããã
ãã®çµæãããã°ã©ã ããã¹ãã«ç€ºãããŠãããã¹ãŠã®æ§æäžã®å¶éãåé¿ããŠããªããžã§ã¯ãã®ç¶æ
ãä¿åããã³åŸ©å
ãããããšã¯æããã§ãã å®è£
ã®ãã®æ©èœã¯ãã©ã¹ã®å ŽåããããŸããã䜿çšã®åºæ¬çãªå¶éã«ãªãå ŽåããããŸãã
詳现ããŒã¿ãä¿åããããã«ãç¹å¥ãªObjectOutputStream
ã¹ããªãŒã ïŒããã³ãã®é¡äŒŒç©ïŒãããŒãã«äœ¿çšãããŸãã ãã®ã¹ããªãŒã ã¯ã䜿çšãããªããžã§ã¯ãå
šäœãå«ãããã¹ãŠã®ããŒã¿åã§æ©èœããŸãã ãã®ã¹ããªãŒã ã«ãã£ãŠçæãããããŒã¿ã«ã¯ãç¬ç«ããæ
å ±ãããã¯ã®ã»ãããå«ãŸããŠããããããã®äœ¿çšã«å¶éã¯ãããŸããã 1ã€ã®ã¹ããªãŒã ã«å¥œããªã ããªããžã§ã¯ããŸãã¯åºæ¬åãä¿åã§ããŸããæãéèŠãªããšã¯ã埩å
ãããšãã«ããããéã®é åºã§èªã¿åãããšã§ãã
ãã®ä¿åããã³åŸ©å
ã¡ã«ããºã ã®éèŠãªæ©èœã¯ãèªã¿åãæ©èœãèšé²ãããããŒã¿ã®å¢çãèªåçã«å¶åŸ¡ããããŒã¿ãæžã蟌ãŸããåŽä»¥å€ã®ããŒã¿ã®èªã¿åããèš±å¯ããªãããšã§ãã
ãªããžã§ã¯ããèšé²ãããŠããå Žåããã®ã³ã³ãã³ããã€ãã®èªã¿åãã¯æ©èœããŸããã
ãã€ãèªã¿åãé¢æ°ã¯ããã€ããšããŠä¿åãããŠããªããããã¯ã®ããŒã¿ãèªã¿åãããšãããšããã«ããšã©ãŒã§äŸå€ãã¹ããŒããŸãã ããã¯åºæ¬çãªããŒã¿ä¿è·ã¡ã«ããºã ã§ãããéåžžã«äŸ¿å©ã§ãã èªåããŒã¿æŽåæ§ãã§ãã¯ãæäŸããŸãã
ããŒã¿ãä¿åããã³åŸ©å
ããããã®ã¯ã©ã¹ã¯ã¹ããªãŒã ã§ããããã®ã³ã³ãã³ãã¯ã¹ããªãŒã ãåŠçããä»»æã®ã¯ã©ã¹ã§ã©ããã§ããŸãã ä¿åãããããŒã¿ãå§çž®ãæå·åããããã¯ãŒã¯çµç±ã§è»¢éãã¡ã¢ãªã«ä¿åãã¢ãŒã«ã€ããŸãã¯å
éšã³ã³ããã«ä¿åã§ããŸãã
ç¹åŸŽ
ãã®æ¹æ³ã¯æããã«åçŽã§ãããéåžžã«ç°¡åã§äœ¿ããããéåžžã«åŒ·åãªã¡ã«ããºã ãæäŸããŸãã 以äžã«èª¬æããæ¬ ç¹ããããŸãããå€ãã®å Žåããã®æ©èœã¯ããã°ã©ããå¿
èŠãšãããã¹ãŠã®ãã®ã«ååã§ãã
詳现äžæã®ãªããžã§ã¯ãã¯äžåºŠã ãã¹ããªãŒã ã«ä¿åãããŸãã åããã®ãžã®ãªã³ã¯ã§ããè€æ°ã®ãªããžã§ã¯ããä¿åãããå Žåããªããžã§ã¯ãããŒã¿ã¯ãã®ãã¡ã®1ã€ã®ã¿ã«å¯ŸããŠä¿åãããæ®ãã¯æ¢ã«ä¿åããããã®ãžã®ãªã³ã¯ã®ã¿ãèšé²ãããŸãã
ããŒã¿ã埩å
ãããšããã¹ãŠã®ãªã³ã¯ãå
ã®ãªããžã§ã¯ãã«ååšããŠããã®ãšåã圢åŒã§åŸ©å
ãããããã«ããªããžã§ã¯ãã埩å
ãããŸãã
ãªããžã§ã¯ããä¿åãããšãçžäºã®ãªã³ã¯ãèªåçã«è¿œè·¡ããã埩å
ãããšãé¡äŒŒãããªããžã§ã¯ãã¯åããªããžã§ã¯ããåç
§ããŸãã ã€ãŸã ãªããžã§ã¯ã«»
ãšãªããžã§ã¯ã«»
ãä¿åããåæã«ãªããžã§ã¯ã«»
ãã£ãŒã«ãã®1ã€ãä¿åããããªããžã§ã¯ã«»
ãžã®ãªã³ã¯ã§ããå Žåãã¯ã©ã¹Â«Â»
2ã€ã®ç°ãªãã³ããŒã¯ä¿åãããŸãããã1ã€ã ããä¿åãããŸãã ãã£ãŒã«ãã埩å
ããå Žåãæ°ãããªããžã§ã¯ã«»
ã¯åãã¹ããªãŒã ãã埩å
ããããªããžã§ã¯ã«»
åç
§ããŸã«»
ã€ãŸãã èèãªããžã§ã¯ããšã®éä¿¡ã埩å
ãããŸãã
ãã®æ©èœã«ããããªã³ã¯ãå£ãããããŒã¿ãè€è£œãããããããšãªããçžäºã«åç
§ãããªããžã§ã¯ãã®æ¥ç¶ãããéå±€ãå®å
šã«ééçã«ç¶æã§ããŸãã
æ£ãã埩å
ã§Â«enum»
ã¯ã©ã¹ã®ä¿åããµããŒãããŸãã
SerializableããŒã«ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæã€ãªããžã§ã¯ãã®ä¿åãšåŸ©å
ããµããŒãããŠããŸãã ç¹ã«ããªã¹ããã»ãããããã³ãããã«åºã¥ããã¹ãŠã®æšæºJDKã³ã¬ã¯ã·ã§ã³ã¯èªåçã«ä¿åãããŸãã ãã¹ãŠã®å®è£
ã«ã¯ãã®ããŒã«ãŒããããŸãã
ã€ãŸã ãªã¹ããŸãã¯ããªãŒã®ãã¹ãŠã®èŠçŽ ãä¿åããã³åŸ©å
ããããã«ãè¿œå ã®ã³ãŒããèšè¿°ããå¿
èŠã¯ãããŸããããªããžã§ã¯ãããSerializableãã€ã³ã¿ãŒãã§ãŒã¹ã§ç€ºãããŠããã°ååã§ãã
- ãã¹ãŠã®ç¥å
ã®ããŒã¿ã¯èªåçã«ä¿åããã³åŸ©å
ãããŸãããã®ã¯ã©ã¹ããç¶æ¿ãããšãçŸåšã®ããŒã¿ããã¹ãŠä¿åãããŸãã
ç¶æ¿ãã§ãŒã³å
šäœã®ä¿åãšåŸ©å
ãä¿èšŒããããã®è¿œå ã®ã¢ã¯ã·ã§ã³ã¯å¿
èŠãããŸããã
ããŒã¿ãä¿åããã³åŸ©å
ããããã»ã¹ãããæ£ç¢ºã«å¶åŸ¡ããã«ã¯ãè¿œå ã®ã¡ã«ããºã ã䜿çšã§ããŸãã
ããŒãžã§ã³ç®¡ç
ãªããªã ãªããžã§ã¯ãã®ããŒã¿ãèªåçã«ä¿åãããå Žåãä¿åãããããŒã¿ãšãªããžã§ã¯ãã®çŸåšã®æ§é ãšã®äºææ§ãå¶åŸ¡ããã¡ã«ããºã ãå¿
èŠã§ãã ã€ãŸã ã¯ã©ã¹ã®ãã£ãŒã«ããè¿œå ãŸãã¯åé€ãããã£ãŒã«ãã®é åºãŸãã¯ã¿ã€ããå€æŽããå ŽåãããŒã¿ã埩å
ãããšãã«ãä¿åãããããŒã¿ãæå³ãããŠããå Žæã«ç§»åããå¿
èŠããããŸãã
ãã®ãããªäºææ§å¶åŸ¡ã¡ã«ããºã ãååšããŸãã ä¿åæã«ãã©ã€ãã©ãªã¯äœ¿çšäžã®ã¯ã©ã¹ã®ã³ãŒããèªåçã«èšç®ããŸãããã®ã¯ã©ã¹ã¯ç¶æ
ãèšè¿°ãã埩å
æã«ããªããžã§ã¯ãã以åã«ä¿åãããããŒã¿ãšäºææ§ããããã©ããããã§ãã¯ããŸãã ãã£ãŒã«ãã埩å
ãããã¯ã©ã¹ã«è¿œå ãããå ŽåããŸãã¯ãããã®é åºãå€æŽãããå Žåãä¿åãããã³ããŒããããŒã¿ã埩å
ã§ããŸããããã£ãŒã«ããåé€ãããå ŽåããŸãã¯ã¿ã€ããå€æŽãããå Žåããã®ãããªããŒã¿ã埩å
ããããšã¯ã§ããããã®ãããªãªããžã§ã¯ããèªã¿åãããšãããšãšã©ãŒãã¹ããŒãããŸã
ã¯ã©ã¹ã®ç¶æ
ãèšè¿°ããã³ãŒãã¯ããªããžã§ã¯ãã®ä¿åæã«èªåçã«èšç®ã§ããŸãããã¯ã©ã¹ãå°æ¥å€æŽãããäºå®ããªãå ŽåããŸãã¯ãã®ãã§ãã¯ã¡ã«ããºã ãç¡å¹ã«ããå Žåã¯ãç¹å¥ãªã¯ã©ã¹ãã£ãŒã«ãã䜿çšã§ããŸãã
class DataClass : Serializable { companion object { const private val serialVersionUID = 1L } }
ãã®ãã£ãŒã«ãã¯ãã¯ã©ã¹ã§èšè¿°ãããLong
åã®éçå®æ°ã§ãªããã°ãªããŸããã
Kotlinã®å Žåããã®å®æ°ã¯@JvmStatic
ã¢ãããŒã·ã§ã³ãŸãã¯const
修食åã䜿çšããŠèšè¿°ããå¿
èŠããããŸããããããªããšãããŒãã©ã€ãã©ãªã¯ããã@JvmStatic
ãŸããã
ããŒã¿ã埩å
ãããšããã¹ããªãŒã ããã®ã³ãŒãã®å€ã¯ãä¿åæã«ç®çã®ã¯ã©ã¹ã«ãã£ãŠå®æ°ãšããŠèšç®ãŸãã¯æžã蟌ãŸããå€ãšãã§ãã¯ããããããã®å€ãäžèŽããªãå Žåããšã©ãŒã§äŸå€ãã¹ããŒãããŸãã
serialVersionUID
ãã£ãŒã«ãã®ã¢ã¯ã»ã¹ã¿ã€ãã¯äœã®åœ¹å²ãæãããããããªãã¯ã§ãé衚瀺ã§ãããŸããŸããã
ã¯ã©ã¹ãæçµçãªåœ¢ãåãããã®å€æŽãèšç»ãããªããªã£ãåŸãããŒãããã³ä¿åã®ãã³ã«ãã®èšç®ãåé¿ããããã«ãã¯ã©ã¹ã«ãã®å®æ°ãèšè¿°ããããšããå§ãããŸãã ãã®å®æ°ã®å€ã¯ãã¯ã©ã¹ã®å®éã®ç¶æ
ãåæ ã§ããŸããã©ã€ãã©ãªã¡ãœããã䜿çšããŠèšç®ããããã¯ã©ã¹ãéèŠã§ãªãå Žåã¯ä»»æã®å€ãå«ããå¿
èŠããããŸãã
ã¯ã©ã¹ç¶æ
å€ãèšç®ããã«ã¯ãJava «serialver»
ãŠãŒãã£ãªãã£ã䜿çšã§ããŸããã䜿çšãã«serialver»
ã¯äžäŸ¿ã§ãããã®ããããã®å€ãããã°ã©ã ã§ååŸããæ¹ãã¯ããã«ç°¡åã§ãã ãããè¡ãã«ã¯ãå¿
èŠãªã¯ã©ã¹ã䜿çšããããã°ã©ã ã§ãã¡ãœãããåŒã³åºããŠãã®ç¶æ
ãèšç®ããååŸããå€ãserialVersionUID
ãã£ãŒã«ãã«èšå®ããŸãã
fun Action() { println( "ID: %d\n", ObjectStreamClass.lookup(DataClass::class.java).serialVersionUID ) //⊠}
ããã°ã©ã åºåïŒ
ID: 991989581060349712
ä¿åããŒã¿ç®¡ç
å€ãã®å Žåããªããžã§ã¯ãã«ååšãããã¹ãŠã®ããŒã¿ãä¿åããã³åŸ©å
ããå¿
èŠã¯ãªãããããã®äžéšã®ã¿ãä¿åããããå®éã®ã¿ã€ãã«å¯Ÿå¿ããªã圢åŒã§åŸ©å
ããå¿
èŠããããŸãã
æåã®å¶åŸ¡ãªãã·ã§ã³ã¯äŸå€ã¡ã«ããºã ã§ãã
åŠçæžã¿ãªã¹ãããäžéšã®ãã£ãŒã«ããé€å€ããã«ã¯ãç¹å¥ãªã¿ã€ãã®ãtransientãã§ããŒã¯ããå¿
èŠããããŸãã Javaã§ã¯ããã«ç¹å¥ãªããŒã¯ãŒãã䜿çšããã Kotlin
ç¹å¥ãªæ³šéã䜿çšããå¿
èŠããããŸãã
class DataClass : Serializable { @JvmField var strField = "" @JvmField var intField = 0 @Transient @JvmField var dbField = 0.0 }
ãã®ã¯ã©ã¹ã®ãªããžã§ã¯ããåŠçãããšããã·ãªã¢ã«åã©ã€ãã©ãªã¯ã dbField
ããã£ãŒã«ãã®å€ãä¿åã埩å
ãããŸããã ä»ã®ãã¹ãŠã®ãã£ãŒã«ãã¯éåžžã©ããä¿åããã³åŸ©å
ãããŸãã
ãã®ã¡ã«ããºã ã¯ãå€ãæå³ããªããªãããŸãã¯ä¿åã§ããªããã£ãŒã«ããªããžã§ã¯ãã®å Žåã«äœ¿çšãããšäŸ¿å©ã§ãã
ããã°ã©ãã¯ãããŒãåŸã«èªåçã«åŠçãããªããã£ãŒã«ãã®å€ãèšå®ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã以äžã§èª¬æããã readResolve
ãã¡ãœããã䜿çšã§ããŸãã
ã¹ãã¬ãŒãžã管çãã2çªç®ã®æ¹æ³ã¯ãä¿åããã³ããŒãã«äœ¿çšããããã£ãŒã«ãã®ååãšã¿ã€ããæå®ã§ããããšã§ãã
ãªããžã§ã¯ããéçºãããšãããªããžã§ã¯ãã®åœ¢åŒããã§ã«å®å
šã«å€æŽãããŠããŠãããã®å
容ã埩å
ããæ©èœãå¿
èŠã«ãªãå ŽåããããŸãã ãããè¡ãã«ã¯ãã¯ã©ã¹ã«å«ãŸããŠããªããã£ãŒã«ããååãå€æŽããããã£ãŒã«ããèªã¿åãããšãã§ããå¿
èŠããããŸãã ããã¯ããã£ãŒã«ããã£ã«ã¿ãªã³ã°ã¡ã«ããºã ã䜿çšããŠã serialPersistentFields
ãšããéçå®æ°ãèšè¿°ããããšã§å®è¡ã§ããŸãã
ããã°ã©ã ã³ãŒã open class DataClass(s : String) : Serializable { @JvmField var strField = "" @JvmField var intField = 0 @JvmField var dbField = 0.0 companion object { const private val serialVersionUID1 = 1L @JvmStatic val serialPersistentFields = arrayOf( ObjectStreamField("strField",String::class.java), ObjectStreamField("intField",Int::class.java) ) } init { strField = s + ":baseText" intField = s.hashCode() dbField = s.hashCode().toDouble() / 1000 } fun print() = outn("str = [%s]\nint = [%d]\ndb = [%f]", strField, intField, dbField) } fun Action() { val a = DataClass("dataA") outn("Saved contents:") a.print() Holder(ObjectOutputStream(File("out.bin").outputStream())).h.writeObject(a) val b = Holder(ObjectInputStream(File("out.bin").inputStream())).h.readObject() if (b is DataClass) { outn("Loaded contents:") b.print() } }
ãã®äŸã§ã¯ã䜿çšå¯èœãª3ã€ã®ãã£ãŒã«ãã®ãã¡2ã€ã®ã¿ãä¿åããŸãã
Saved contents: str = [dataA:baseText] int = [95356375] db = [95356,375000] Loaded contents: str = [dataA:baseText] int = [95356375] db = [0,000000]
ããŒã¿ã®æåããã¯ã¢ãããšãªã«ããª
å Žåã«ãã£ãŠã¯ãèªåããŒã«ããšã©ãŒãªãã§æ©èœããããã«ãæ§é ãŸãã¯æ§é ã®å€æŽã説æã§ããªãããšããããŸãã ãã®å Žåãã¯ã©ã¹ãã£ãŒã«ãã®å€ãæåã§ä¿åãŸãã¯åŸ©å
ããå¿
èŠããããŸãããèªååããŒã«ã«ãã£ãŠæäŸããããã¹ãŠã®å©ç¹ã倱ããããªãã§ãããã
ãã£ãŒã«ãã®1ã€ã§ããã£ãŒã«ãã®1ã€ã®ååãå€æŽãããåæã«ç¢ºèªããå¿
èŠããããšããŸã
æ°ããååãšå€ãååã®äž¡æ¹ã§ããŒã¿ãããŒãããŸãã èªååããŒã«ã¯ãã®ãããªå€æŽã«å¯Ÿå¿ã§ããŸãããããªããžã§ã¯ãã®ãã£ãŒã«ããæåã§æäœã§ããŸãã ã·ãªã¢ã©ã€ãºå¯èœãªãªããžã§ã¯ãã¯ããã®å
容ãããŒãããã³ä¿åããããã«åŒã³åºãããwriteObject
ããã³readObject
é¢æ°ãèšè¿°ããããšãã§ãwriteObject
ã
ããã°ã©ã ã³ãŒã open class DataClass(s : String) : Serializable { @JvmField var strField = "" @JvmField var intFieldChanged = 0 @JvmField var dbField = 0.0 companion object { const private val serialVersionUID1 = 1L @JvmStatic val serialPersistentFields = arrayOf( ObjectStreamField("strField", String::class.java), ObjectStreamField("intField", Int::class.java) ) } init { strField = s + ":baseText" intFieldChanged = s.hashCode() dbField = s.hashCode().toDouble() / 1000 } fun print() = outn("str = [%s]\nint = [%d]\ndb = [%f]", strField, intFieldChanged, dbField) private fun readObject(s : ObjectInputStream) { val fields = s.readFields() strField = fields.get("strField", "" as Any?) as String intFieldChanged = fields.get("intField", 0) } private fun writeObject(s : ObjectOutputStream) { val fields = s.putFields() fields.put("strField", strField as Any?) fields.put("intField", intFieldChanged) s.writeFields() } }
ãã®äŸã§ã¯ãã¯ã©ã¹ãã£ãŒã«ãã®ååã¯intFieldChanged
ã«ãªããŸããããä¿åãããããŒã¿ã§ã¯ããã®ååã¯åŒãç¶ãintField
ãšããŠè¡šç€ºããintField
ãããã«ãããå€ãååã§ä¿åãããããŒã¿ãããŒãããå€ãã¯ã©ã¹ãããŒãã§ããããã«ä¿åã§ããŸãã
writeObject
ããã³readObject
ã®ããã¹ãã§ã¯ãããŒã¿ãä¿åããã³ããŒãããããã®ä»»æã®ããžãã¯ãå®è£
ã§ããŸãã
äžèšã®äŸã§å®è£
ãããŠããã©ã€ãã©ãªãæäŸããã¡ã«ããºã ã䜿çšããããšãããªããžã§ã¯ãã®ä¿åãšåŸ©å
ãå®å
šã«æåã§å®è£
ããããšãã§ããŸãã 確ãã«ãåŸè
ã®å ŽåãäŸã§å®è£
ãããŠããããã«ãä¿æãããæ§é ã®é£ç¶æ§ã確ä¿ããããšã¯å°é£ã§ãããå€ãã®å Žåããã®ãããªå¿
èŠæ§ã¯ãããŸããã æåã§ããŒã¿ãæäœããå ŽåãããŒã¿ãä¿åãããé åºãšåãé åºã§åŸ©å
ãããããã«ããå¿
èŠããããŸãã
ããã°ã©ã ã³ãŒã open class DataClass(s : String) : Serializable { @JvmField var strField = "" @JvmField var intField = 0 companion object { const private val serialVersionUID1 = 1L } init { strField = s + ":baseText" intField = s.hashCode() } fun print() = outn("str = [%s]\nint = [%d]", strField, intField) private fun readObject(s : ObjectInputStream) { strField = s.readUTF() intField = s.readInt() } private fun writeObject(s : ObjectOutputStream) { s.writeUTF(strField) s.writeInt(intField) } }
ã·ã³ã°ã«ãã³å埩
ããŒã¿ã埩å
ãããšãã©ã€ãã©ãªã¯ãªããžã§ã¯ããžã®ãªã³ã¯ãèªåçã«åŸ©å
ããŸãããããã¯åäžã®ã³ããŒã«ååšãããªããžã§ã¯ããæäœããã«ã¯äžååã§ãã ããŒããããšã1ã€ã§ãããæ°ãããªããžã§ã¯ããäœæãããŸãããããŒããããèŠçŽ ã¯ããã°ã©ã å
ã®æ¢åã®èŠçŽ ãåç
§ããå¿
èŠããããŸãã
ãã®åäœã確èªã§ããŸãã
ãã®ããã«ã¯ãäžææ§ãæäŸããã¯ã©ã¹ãreadResolve
ã¡ãœãããäœæããã ãã§ååã§ãã ãã®ã¡ãœããã¯ããã®ã¯ã©ã¹ã®ãªããžã§ã¯ããããŒãããåŸã«åŒã³åºãããå¥ã®ãªããžã§ã¯ãã«çœ®ãæããããšãã§ããŸãã
ããã°ã©ã ã³ãŒã class LinkedData private constructor(@JvmField val value : Int) : Serializable { companion object { @JvmField val ZERO = LinkedData(0) @JvmField val NONZERO = LinkedData(1) @JvmStatic fun make(v : Int) = if (v == 0) ZERO else NONZERO } private fun readResolve() : Any = if ( value == 0 ) ZERO else NONZERO } open class DataClass(v : Int) : Serializable { @JvmField val link = LinkedData.make(v) @JvmField var intField = v companion object { const private val serialVersionUID1 = 1L } fun print() = outn("int = [%d]\nlink = [%s]", intField, if (link == LinkedData.ZERO) "ZERO" else if (link == LinkedData.NONZERO) "NONZERO" else "OTHER!" ) }
:
Saved contents: int = [100] link = [NONZERO] Loaded contents: int = [100] link = [NONZERO]
, LinkedData
readResolve
, , .
, .
,
, , (), .
ObjectInputStream
ObjectOutputStream
annotateClass
annotateProxyClass
.
, .
çæ
, Serializable
, , .
詳现.
, , . , . , .
,
XML
, .. . Serializable
, .
, , .
, JSON
, .
â .
- , , .
: Serializable !
, .
, «» , , , . , , .
Externalizable
, Java â Externalizable
.
ObjectInput
ObjectOutput
Serializable
, , , .
readExternal
writeExternal
, .
Serializable
, Externalizable
, . , , .
Serializable
Externalizable
, .
. . readResolve
, , .
class LinkedData private constructor(@JvmField val value : Int) { companion object { @JvmField val ZERO = LinkedData(0) @JvmField val NONZERO = LinkedData(1) @JvmStatic fun make(v : Int) = if (v == 0) ZERO else NONZERO } } open class DataClass : Externalizable { @JvmField var link : LinkedData @JvmField var intField : Int constructor() { link = LinkedData.ZERO; intField = 0 } constructor(v : Int) { link = LinkedData.make(v); intField = v } fun print() = outn("int = [%d]\nlink = [%s]", intField, if (link == LinkedData.ZERO) "ZERO" else if (link == LinkedData.NONZERO) "NONZERO" else "OTHER!") override fun readExternal(s : ObjectInput) { link = if ( s.readByte().toInt() == 0 ) LinkedData.ZERO else LinkedData.NONZERO intField = s.readInt() } override fun writeExternal(s : ObjectOutput) { s.writeByte(if(link == LinkedData.ZERO) 0 else 1) s.writeInt(intField) } }
link
.. . link
.
, , , . , .
«DataClass» , .
ç¹åŸŽ
Externalizable
, , .
, , , Serializable
.
詳现, , . , , , .
, Externalizable
, , , , - .
, , , , , , . - , .
, , ObjectStream
, . , .
, , , , , Serialilzable
. , .
, , , , , , . , .
,
.. , , . , , .
,, , .
:
0) <noname> addCaller.t_ForOrGetPut org.sun.NotNotEmptyGetEach( SetEmptyCombineSplit ) 1) fNotRandom addCaller.For(void, addCaller.t_HasEmpty Has, addCaller.t_Combine GetCombineHas ) 2) fOrSet app.PutHasForGet( app.t_Set HasCombineAdd, app.t_ForNotOrAdd Combine ) 3) fHasSplit org.sun.Set( Set, sec.sun.t_JoinEmptyHasCombineCombine EmptyCombineOr ) 4) fJoinEach sec.sun.t_OrForEmptySet sec.sun.EachPutOrNot( org.sun.t_Combine SetHasSplitJoinEmpty, void ) 5) fEachSet org.sun.t_RandomSplit app.OrIsFor( sec.sun.t_Set CombineGetRandom, void ) 6) <noname> app.t_NotSetForForGet sun.NotHasForSplitAdd( org.sun.t_IsRandomOrHas Each, void) 7) fNotSplit addCaller.t_NotAdd sec.sun.IsHasNot( app.t_HasForSplitHas ForGet, void ) 8) <noname> sun.SetForSplitSet( PutCombine, void, void ) 9) fCombineNot sun.t_SplitRandomGetRandom sun.AddAdd( void, org.sun.t_NotRandomHasEmpty AddPutNotSplit ) 10) <noname> addCaller.t_ForIs sun.EachIs( NotFor, void, void, PutSplitAddNot ) 11) fSetOr app.HasJoin( OrOr, void, void, addCaller.t_NotAddHas Each )
, .
, <noname>
void
, .
, , .. , . , , , .
:
SerialFull
â Serializable
.
Extern+Ser
â Externalizable
, .
ExternFull
â Externalizable
.
JsJsonMini
â «minimal-json», JSON
.
minimal-json-0.9.4.jar
, : https://github.com/ralfstx/minimal-json .
fasterXML-jackson
JSON
.
2.0.4
, : https://github.com/FasterXML/jackson . . ( JsJackAnn
), , , annotations-databind
. ( JsJackSream
) , stream
.
- Java
XML
«org.w3c.dom.Document
org.w3c.dom.Element
.
.
, , .
:
USAGE: SerializableTest.jar [-opts] Where OPTS are: -Count=<number> - set number of items to generate -Retry=<number> - set number of iterations for each test -Out=<file> - set file name to output -Nout - disable items output -gc - run gc after every test
:
ãªããªã , . , , , .
çµæ
JVM , , .
>sb -n "-c=100000" "-r=10" Output file : test_out Number of elements: 100000 Number of retries : 10 Tests complete in 0:01:28.050 sec :: Save 0:00:31.903, Load 0:00:30.149, Total 0:01:02.103, Waste 0:00:25.947
100.000 , 10 . 1 28
, 25.9
.
å Žæ | å | | | | èªã¿èŸŒã¿äž | | | åèš | | | ãã¡ã€ã« |
---|
6 | SerialFull | 0:00:07.599 | 2,34 | | 0:00:04.217 | 1,05 | 1,45 | 0:00:11.826 | 1,56 | 0,41 | 18 |
1 | ExternFull | 0:00:02.550 | 0.12 | 1,98 | 0:00:02.061 | | 4,02 | 0:00:04.616 | | 2,60 | 16 |
5 | Extern+Ser | 0:00:05.744 | 1,52 | 0,32 | 0:00:04.112 | 1,00 | 1,51 | 0:00:09.862 | 1,14 | 0,69 | 22.5 |
7 | XMLw3c | 0:00:06.278 | 1,76 | 0,21 | 0:00:10.337 | 4,02 | | 0:00:16.620 | 2,60 | | 32 |
4 | JsJsonMini | 0:00:04.678 | 1,05 | 0,62 | 0:00:04.614 | 1,24 | 1,24 | 0:00:09.302 | 1,02 | 0,79 | 25.9 |
3 | JsJackAnn | 0:00:02.776 | 0.22 | 1.74 | 0:00:02.431 | 0,18 | 3,25 | 0:00:05.215 | 0,13 | 2,19 | 25.9 |
2 | JsJackSream | 0:00:02.278 | | 2,34 | 0:00:02.377 | 0,15 | 3,35 | 0:00:04.662 | 0,01 | 2,56 | 25.9 |
.
«»
, .«»
.«»
, «»
«»
, , .«»
«»
, «»
.- .
«»
, .
ã³ã¡ã³ã
ã·ãªã¢ã©ã€ãºå¯èœ
.
. , , , .
, , â . , , .
Externalizable
.
詳现, . ( Extern+Ser
) , . .
.. , , .
, , .
Java , - (, , ), . , Java â EOF
, , .
.. JSON
, .
minimal-json
, .
詳现, . , . .
â , , .
. , JSON
. , , , .
fasterXML-jackson databind
, , .
詳现, .
, , . , Serializable
, , .
, . . , , , .
JavaDOC
, .. , .
, , . , , . â , .
, :
, , .. .
, , , , , , .
fasterXML-jackson stream
JSON
.
詳现.
, JSON
, . , JSON
. , .
, , .
jackson-core
, 200, 4 databind
.
, , .
XML
.
, . 400.000 - , 5 JVM
.
, . fasterXML-jackson
stream
.. , , .
, , , . .
åç
§è³æ
.