| ç®æ¬¡|å|次 | Javaãªããžã§ã¯ãçŽåå仿§ Version 6.0 |
第1ç«
SerializableãŸãã¯Externalizableã€ã³ã¿ãã§ãŒã¹ã®ã©ã¡ããããµããŒãã§ããŸãã JavaTMãªããžã§ã¯ãã®å Žåã¯ãçŽååããã圢åŒãããªããžã§ã¯ãã®å
容ãä¿åãããJavaTMã¯ã©ã¹ãèå¥ããã³æ€èšŒãããã®å
å®¹ãæ°ããã€ã³ã¹ã¿ã³ã¹ã«åŸ©å
ã§ããªããã°ãããŸããã çŽååå¯èœãªããžã§ã¯ãã®å Žåãã¹ããªãŒã ã«ã¯ãã¹ããªãŒã å
ã®ãã£ãŒã«ããäºæããŒãžã§ã³ã®ã¯ã©ã¹ã«åŸ©å
ããããã«ååãªæ
å ±ãåã蟌ãŸããŸãã Externalizableãªããžã§ã¯ãã®å Žåãã¯ã©ã¹ãå
容ã®å€éšãã©ãŒãããã«è²¬ä»»ãæã¡ãŸãã
ä¿åããã³åãåºããªããžã§ã¯ãã¯ãã»ãã®ãªããžã§ã¯ããåç §ããŠããããšããããããŸãã ãããã®ã»ãã®ãªããžã§ã¯ãã¯ããªããžã§ã¯ãéã®é¢ä¿ãä¿æããããã«ãåæã«ä¿åããã³åãåºãããå¿ èŠããããŸãã ãªããžã§ã¯ããä¿åããããšããã®ãªããžã§ã¯ãããå°éå¯èœãªãã¹ãŠã®ãªããžã§ã¯ããä¿åãããŸãã
JavaTMãªããžã§ã¯ãã®çŽååã®ç®æšã¯æ¬¡ã®ãšããã§ãã
// Serialize today's date to a file.
FileOutputStream f = new FileOutputStream("tmp");
ObjectOutput s = new ObjectOutputStream(f);
s.writeObject("Today");
s.writeObject(new Date());
s.flush();
ãŸããOutputStream (ãã®å Žåã¯FileOutputStream)ãããã€ããåãåãããã«å¿
èŠã§ãã æ¬¡ã«ãFileOutputStreamã«æžã蟌ãObjectOutputStreamãäœæãããŸãã ãããŠãæååãTodayããšDateãªããžã§ã¯ããã¹ããªãŒã ã«æžã蟌ãŸããŸãã ããæ±çšçã«èšãã°ããªããžã§ã¯ãã¯writeObjectã¡ãœããã«ãã£ãŠæžã蟌ãŸããããªããã£ãã¯DataOutputã®ã¡ãœããã«ãã£ãŠã¹ããªãŒã ã«æžã蟌ãŸããŸãã
writeObjectã¡ãœãã(ã»ã¯ã·ã§ã³2.3ãwriteObjectã¡ãœããããåç
§)ã¯ãæå®ããããªããžã§ã¯ããçŽååãããªããžã§ã¯ãã»ã°ã©ãå
ã®ã»ãã®ãªããžã§ã¯ããžã®åç
§ãååž°çã«ãã©ããŒã¹ããŠãã°ã©ãã®å®å
šã«çŽååããã衚çŸãäœæããŸãã ã¹ããªãŒã å
ã§ããªããžã§ã¯ããžã®æåã®åç
§ã§ã¯ããªããžã§ã¯ããçŽååãŸãã¯å€éšåããããã®ãªããžã§ã¯ãã®ãã³ãã«ãå²ãåœãŠãããŸãã ãã®ãªããžã§ã¯ããžã®ãã以åŸã®åç
§ã¯ããã³ãã«ãšããŠãšã³ã³ãŒããããŸãã ãªããžã§ã¯ãã»ãã³ãã«ã䜿çšããŠãããªããžã§ã¯ãã»ã°ã©ãå
ã§åœç¶çºçããå
񑆇
§ã埪ç°åç
§ã¯ä¿æãããŸãã ãªããžã§ã¯ãã®ãã以åŸã®åç
§ã¯ãã³ãã«ã ãã䜿çšãããããéåžžã«ç°¡æœãªè¡šçŸãå¯èœã«ãªããŸãã
é
åãenum宿°ãããã³ClassãObjectStreamClassãStringåã®ãªããžã§ã¯ãã«ã¯ãç¹å¥ã®åŠçãå¿
èŠã§ãã ãã®ä»ã®ãªããžã§ã¯ãã¯ãã¹ããªãŒã ã«ä¿åããããããããåãåºãããããããã®SerializableãŸãã¯Externalizableã€ã³ã¿ãã§ãŒã¹ãå®è£
ããªããã°ãããŸããã
ããªããã£ãã»ããŒã¿åã¯ãDataOutputã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœãã(writeIntãwriteFloatãwriteUTFãªã©)ã§ã¹ããªãŒã ã«æžã蟌ãŸããŸãã åå¥ã®ãã€ããšãã€ãé
åã¯ãOutputStreamã®ã¡ãœããã§æžã蟌ãŸããŸãã çŽååå¯èœãã£ãŒã«ã以å€ã®ããªããã£ãã»ããŒã¿ã¯ãããã¯ã»ããŒã¿ã»ã¬ã³ãŒãã§ã¹ããªãŒã ã«æžã蟌ãŸããåã¬ã³ãŒãã®åã«ã¯ããŒã«ãŒãšã¬ã³ãŒãå
ã®ãã€ãæ°ã瀺ãããŸãã
ObjectOutputStreamãæ¡åŒµããŠãã¹ããªãŒã ã®ã¯ã©ã¹ã«é¢ããæ
å ±ãã«ã¹ã¿ãã€ãºããããçŽååããããªããžã§ã¯ãã眮ãæããããšãã§ããŸãã 詳现ã¯ãannotateClassãšreplaceObjectã¡ãœããã®èª¬æãåç
§ããŠãã ããã
// Deserialize a string and date from a file.
FileInputStream in = new FileInputStream("tmp");
ObjectInputStream s = new ObjectInputStream(in);
String today = (String)s.readObject();
Date date = (Date)s.readObject();
ãŸãããœãŒã¹ã»ã¹ããªãŒã ãšããŠãInputStream (ãã®å Žåã¯FileInputStream)ãå¿
èŠã§ãã æ¬¡ã«ãInputStreamããèªã¿èŸŒãObjectInputStreamãäœæãããŸãã ãããŠãæååãTodayããšDateãªããžã§ã¯ããã¹ããªãŒã ããèªã¿èŸŒãŸããŸãã ããæ±çšçã«èšãã°ããªããžã§ã¯ãã¯readObjectã¡ãœããã§èªã¿èŸŒãŸããããªããã£ãã¯DataInputã®ã¡ãœããã«ãã£ãŠã¹ããªãŒã ããèªã¿èŸŒãŸããŸãã
readObjectã¡ãœããã¯ãã¹ããªãŒã å
ã®æ¬¡ã®ãªããžã§ã¯ããçŽåå埩å
ããã»ãã®ãªããžã§ã¯ããžã®åç
§ãååž°çã«ãã©ããŒã¹ããŠãçŽååããããªããžã§ã¯ãã®å®å
šãªã°ã©ããäœæããŸãã
ããªããã£ãã»ããŒã¿åã¯ãDataInputã€ã³ã¿ãã§ãŒã¹ã®ã¡ãœãã(readIntãreadFloatãreadUTFãªã©)ããèªã¿èŸŒãŸããŸãã åå¥ã®ãã€ããšãã€ãé
åã¯ãInputStreamã®ã¡ãœããã§èªã¿èŸŒãŸããŸãã çŽååå¯èœãã£ãŒã«ã以å€ã®ããªããã£ãã»ããŒã¿ã¯ãããã¯ã»ããŒã¿ã»ã¬ã³ãŒãããèªã¿èŸŒãŸããŸãã
ObjectInputStreamãæ¡åŒµããŠãã¯ã©ã¹ã«é¢ããã¹ããªãŒã å
ã®ã«ã¹ã¿ãã€ãºãããæ
å ±ãå©çšããããçŽåå埩å
ããããªããžã§ã¯ãã眮ãæããããšãã§ããŸãã 詳现ã¯ãresolveClassãšresolveObjectã¡ãœããã®èª¬æãåç
§ããŠãã ããã
ã³ã³ãããšããŠäœçšããåãªããžã§ã¯ãã¯ãããªããã£ãããªããžã§ã¯ããä¿åãããåãåºãããã§ããã€ã³ã¿ãã§ãŒã¹ãå®è£
ããŸãã ãããã®ã€ã³ã¿ãã§ãŒã¹ã¯ãObjectOutputããã³ObjectInputã€ã³ã¿ãã§ãŒã¹ã§ãããæ¬¡ã®ããšãè¡ããŸãã
ãªããžã§ã¯ãã»ã¹ããªãŒã ã«ä¿åãããã«ã¯ãåãªããžã§ã¯ãã¯SerializableãŸãã¯Externalizableã€ã³ã¿ãã§ãŒã¹ãå®è£
ããªããã°ãããŸããã
Serializableã¯ã©ã¹ã®å Žåããªããžã§ã¯ãçŽååã«ãã£ãŠããªããžã§ã¯ãã®åã¯ã©ã¹ã®ãã£ãŒã«ããèªåçã«ä¿åããã³åŸ©å
ããããã£ãŒã«ããã¹ãŒããŒã»ã¿ã€ãã远å ããããšã§å±éããã¯ã©ã¹ãèªåçã«åŠçãããŸãã çŽååå¯èœã¯ã©ã¹ã¯ãã©ã®ãã£ãŒã«ããä¿åãŸãã¯åŸ©å
ããããã宣èšãããªãã·ã§ã³å€ããªããžã§ã¯ãã®æžã蟌ã¿ãèªèŸŒã¿ãè¡ãããšãã§ããŸãã Externalizableã¯ã©ã¹ã®å Žåããªããžã§ã¯ãçŽååã¯ããã®å€éšãã©ãŒããããããã³ã¹ãŒããŒã»ã¿ã€ãã®ç¶æ
ãã©ã®ããã«ä¿åããã³åŸ©å
ããããã®å®å
šãªå¶åŸ¡ãã¯ã©ã¹ã«å§è²ããŸããSerializableã¯ã©ã¹ã«ç¹å¥ãªãã£ãŒã«ãserialPersistentFieldsã宣èšããããšã«ãã£ãŠãªãŒããŒã©ã€ãã§ããŸãã ãã®ãã£ãŒã«ãã¯ãçŽååå¯èœãã£ãŒã«ãã®ååããã³åãäžèŠ§è¡šç€ºããObjectStreamFieldãªããžã§ã¯ãã®é
åã䜿ã£ãŠãåæåããå¿
èŠããããŸãã ãã£ãŒã«ãã®ä¿®é£Ÿåã¯ãprivateãstaticãããã³finalã«ããå¿
èŠããããŸãã ãã£ãŒã«ãã®å€ãnullã§ããããObjectStreamField[]ã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãªãå ŽåããŸãã¯ãã£ãŒã«ããå¿
é ã®ä¿®é£Ÿåãæããªãå Žåã¯ããã£ãŒã«ãããŸã£ãã宣èšãããŠããªãå Žåãšåãåäœã«ãªããŸãã
ããšãã°ã次ã®å®£èšã¯ãããã©ã«ãã®åäœãè€è£œããŸãã
class List implements Serializable {
List next;
private static final ObjectStreamField[] serialPersistentFields
= {new ObjectStreamField("next", List.class)};
}
serialPersistentFieldsã䜿çšããŠã¯ã©ã¹ã®Serializableãã£ãŒã«ããå®çŸ©ããããšã«ãã£ãŠãçŽååå¯èœãã£ãŒã«ãã¯Serializableã¯ã©ã¹ã®çŸåšã®å®çŸ©å
ã®ãã£ãŒã«ãã§ãªããã°ãããªããšããå¶éããªããªããŸãã Serializableã¯ã©ã¹ã®writeObjectããã³readObjectã¡ãœããã¯ãã»ã¯ã·ã§ã³1.7ãã¯ã©ã¹ã®çŽååå¯èœãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãã«èšè¿°ãããŠããã€ã³ã¿ãã§ãŒã¹ã䜿çšããŠãã¯ã©ã¹ã®çŸåšã®å®è£
ãã¯ã©ã¹ã®çŽååå¯èœãã£ãŒã«ãã«ãããã³ã°ã§ããŸãã ãããã£ãŠãSerializableã¯ã©ã¹ã®ãã£ãŒã«ãã¯ããšã®ãªãªãŒã¹ã§å€æŽã§ããŸã(ãªãªãŒã¹å¢çããŸããã£ãŠäºææ§ãæã€å¿
èŠãããSerializableãã£ãŒã«ããžã®ãããã³ã°ãä¿æããŠããããã)ã
serialPersistentFieldsã¯èšå®ã§ããŸãã(ãã ããstaticã¡ã³ããŒã»ã¯ã©ã¹ã«ã¯èšå®ã§ããŸã)ã å
éšã¯ã©ã¹ã»ã€ã³ã¹ã¿ã³ã¹ã®çŽååã«é¢ãããã®ä»ã®å¶éäºé
ã«ã€ããŠã¯ãã»ã¯ã·ã§ã³1.10ãSerializableã€ã³ã¿ãã§ãŒã¹ããåç
§ããŠãã ããã
@serialã@serialFieldãããã³@serialDataã¯ããœãŒã¹ã»ã³ãŒãå
ã®Serializableã¯ã©ã¹ã®çŽåå圢åŒãããã¥ã¡ã³ãåããæ¹æ³ãæäŸããŸãã
@serialã¿ã°ã¯ãjavadocã³ã¡ã³ãå
ã«çœ®ãã¹ãã§ãã æ§æã¯ä»¥äžã®ãšããã§ã: @serial field-descriptionãªãã·ã§ã³ã®field-descriptionã«ã¯ããã£ãŒã«ãã®æå³ãšèšå®å¯èœãªå€ãèšè¿°ããŸãã field-descriptionãè€æ°è¡ã«ãŸãããããšãå¯èœã§ãã åæãªãªãŒã¹åŸã«ãã£ãŒã«ãã远å ããå Žåã¯ããã£ãŒã«ãã远å ãããããŒãžã§ã³ã@sinceã¿ã°ã䜿ã£ãŠç€ºããŸãã @serialã®field-descriptionã¯ãçŽåååºæã®ããã¥ã¡ã³ããæäŸããçŽåå圢åŒããã¥ã¡ã³ãå
ã§ãã£ãŒã«ãã®javadocã³ã¡ã³ãã«ä»å ãããŸãã serialPersistentFieldsé
åã®ObjectStreamFieldã³ã³ããŒãã³ããããã¥ã¡ã³ãåããã«ã¯ã@serialFieldã¿ã°ã䜿ããŸãã åObjectStreamFieldã³ã³ããŒãã³ãã§ããããã®ã¿ã°ã®ãã¡ã®1ã€ã䜿ãã¹ãã§ãã æ§æã¯ä»¥äžã®ãšããã§ã: @serialField field-name field-type field-description @serialDataã¿ã°ã¯ãæžã蟌ã¿ãŸãã¯èªèŸŒã¿ãè¡ãããããŒã¿ã®é åºããã³åãèšè¿°ããŸãã ãã®ã¿ã°ã¯ãwriteObjectã«ãã£ãŠæžã蟌ãŸãããªãã·ã§ã³ã»ããŒã¿ããŸãã¯Externalizable.writeExternalã¡ãœããã«ãã£ãŠæžã蟌ãŸãããã¹ãŠã®ããŒã¿ã®é åºãšåãèšè¿°ããŸãã æ§æã¯ä»¥äžã®ãšããã§ã: @serialData data-description ã¯ã©ã¹ãSerializableãšããŠå®£èšããå Žåããªããžã§ã¯ãã®çŽååå¯èœç¶æ
ã¯ãçŽååå¯èœãã£ãŒã«ã(ååãšåã«ãã)ã«å ãããªãã·ã§ã³ã»ããŒã¿ã«ãã£ãŠå®çŸ©ãããŸãã ãªãã·ã§ã³ã»ããŒã¿ã¯ãSerializableã¯ã©ã¹ã®writeObjectã¡ãœããã«ãã£ãŠã®ã¿æç€ºçã«æžã蟌ãããšãã§ããŸãã ãªãã·ã§ã³ã»ããŒã¿ã¯Serializableã¯ã©ã¹ã®readObjectã¡ãœããã«ãã£ãŠèªã¿èŸŒãããšãã§ããçŽååã¯èªã¿èŸŒãŸããªããªãã·ã§ã³ã»ããŒã¿ãã¹ãããããŸãã
ã¯ã©ã¹ãExternalizableãšããŠå®£èšããå Žåãã¯ã©ã¹èªäœã«ãã£ãŠã¹ããªãŒã ã«æžã蟌ãŸããããŒã¿ãçŽååç¶æ ãå®çŸ©ããŸãã ã¯ã©ã¹ã¯ãã¹ããªãŒã ã«æžã蟌ãŸããåããŒã¿ã®é çªãåãããã³æå³ãæå®ããå¿ èŠããããŸãã ã¯ã©ã¹ã¯ã以åã®ããŒãžã§ã³ã§æžã蟌ãŸããããŒã¿ãåŒãç¶ãèªã¿èŸŒããããã«ãããã³ä»¥åã®ããŒãžã§ã³ã§èªã¿èŸŒãŸããããŒã¿ãæžã蟌ããããã«ãç¬èªã®å±éãåŠçããå¿ èŠããããŸãã ã¯ã©ã¹ã¯ãããŒã¿ã®ä¿åããã³åŸ©å æã«ã¯ãã¹ãŒããŒã»ã¯ã©ã¹ãšé£æºããªããã°ãããŸããã ã¹ããªãŒã å ã®ã¹ãŒããŒã¯ã©ã¹ã»ããŒã¿ã®äœçœ®ãæå®ããå¿ èŠããããŸãã
Serializableã¯ã©ã¹ã®èšèšè ã¯ãã¯ã©ã¹ã«ä¿åãããæ å ±ãæ°žç¶æ§ã«é©ããŠããŠãçžäºéçšæ§ããã³å±éã®ããã«çŽåååºæã®èŠåã«åŸã£ãŠããããšãä¿èšŒããå¿ èŠããããŸãã ã¯ã©ã¹ã®å±éã®è©³çްã«ã€ããŠã¯ã第5ç« ãçŽååå¯èœãªããžã§ã¯ãã®ããŒãžã§ã³ç®¡çããåç §ããŠãã ããã
Serializableã€ã³ã¿ãã§ãŒã¹ãå®è£
ãããã以äžã®ã«ã¹ã¿ãã€ãºãè¡ããªããªããžã§ã¯ããèªã¿èŸŒã¿ãŸãã¯æžã蟌ããšãã«ã¯ãããã©ã«ãã®ã¡ã«ããºã ãèªåçã«äœ¿ãããŸãã çŽååå¯èœãã£ãŒã«ãã¯ãã¯ã©ã¹ã®å¯Ÿå¿ãããã£ãŒã«ãã«ãããã³ã°ãããå€ã¯ãããã®ãã£ãŒã«ãããã¹ããªãŒã ã«æžã蟌ãŸãããããŸãã¯èªã¿èŸŒãŸããŠããããå²ãåœãŠãããŸãã ã¯ã©ã¹ãwriteObjectããã³readObjectã¡ãœãããæäŸããå Žåã¯ãdefaultWriteObjectããã³defaultReadObjectãåŒã³åºãããšã«ãã£ãŠããã©ã«ãã»ã¡ã«ããºã ãåŒã³åºãããšãã§ããŸãã writeObjectããã³readObjectã¡ãœãããå®è£
ãããŠãããšãã¯ãçŽååå¯èœãã£ãŒã«ãå€ãæžã蟌ãŸããåãŸãã¯èªã¿èŸŒãŸããããšã«ãã¯ã©ã¹ã¯ãããã倿Žããæ©äŒãæã¡ãŸãã
ããã©ã«ãã»ã¡ã«ããºã ã䜿çšã§ããªãå Žåã¯ãçŽååå¯èœã¯ã©ã¹ã¯ãObjectOutputStreamã®putFieldsã¡ãœããã䜿ã£ãŠãçŽååå¯èœãã£ãŒã«ãã®å€ãã¹ããªãŒã ã«çœ®ãããšãã§ããŸãã ObjectOutputStreamã®writeFieldsã¡ãœããã¯ãå€ãæ£ããé åºã§çœ®ããŠãããçŽååã®æ¢åã®ãããã³ã«ã䜿ã£ãŠã¹ããªãŒã ã«ãããã®å€ãæžã蟌ã¿ãŸãã åæ§ã«ãObjectInputStreamã®readFieldsã¡ãœããã¯ãã¹ããªãŒã ããå€ãèªã¿èŸŒã¿ãã¯ã©ã¹ãååã§(ãã€ä»»æã®é åºã§)ããããå©çšã§ããããã«ããŸãã çŽååå¯èœãã£ãŒã«ãAPIã®è©³çްã¯ãã»ã¯ã·ã§ã³2.2ãObjectOutputStream.PutFieldã¯ã©ã¹ãããã³ã»ã¯ã·ã§ã³3.2ãObjectInputStream.GetFieldã¯ã©ã¹ããåç
§ããŠãã ããã
ObjectOutputã€ã³ã¿ãã§ãŒã¹ã¯ããªããžã§ã¯ãã»ã¹ãã¬ãŒãžãžã®abstractã¹ããªãŒã ã»ããŒã¹ã»ã€ã³ã¿ãã§ãŒã¹ãæäŸããŸãã ãã®ã€ã³ã¿ãã§ãŒã¹ã¯DataOutputã€ã³ã¿ãã§ãŒã¹ã®æ¡åŒµãªã®ã§ããããã®ã¡ãœããã䜿ã£ãŠããªããã£ãã»ããŒã¿åãæžã蟌ãããšãã§ããŸãã ãã®ã€ã³ã¿ãã§ãŒã¹ãå®è£
ãããªããžã§ã¯ãã䜿ãã°ãããªããã£ãããªããžã§ã¯ããæ ŒçŽã§ããŸãã
package java.io;
public interface ObjectOutput extends DataOutput
{
public void writeObject(Object obj) throws IOException;
public void write(int b) throws IOException;
public void write(byte b[]) throws IOException;
public void write(byte b[], int off, int len) throws IOException;
public void flush() throws IOException;
public void close() throws IOException;
}
The writeObjectã¡ãœããã¯ããªããžã§ã¯ããæžã蟌ãããã«äœ¿çšããŸãã ã¹ããŒãããäŸå€ã¯ããªããžã§ã¯ãããã®ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããŠãããšãã«èµ·ãã£ããšã©ãŒããã¹ãã¬ãŒãžã«æžã蟌ãã§ãããšãã«èµ·ãã£ãäŸå€ã衚ããŠããŸãã äœããã®äŸå€ãã¹ããŒãããå Žåããã®ã¹ãã¬ãŒãžãç ŽæããŠããå¯èœæ§ããããŸãã ãã®ãããªäºæ
ãçºçããå Žåã¯ããã®ã€ã³ã¿ãã§ãŒã¹ãå®è£
ããŠãããªããžã§ã¯ããåç
§ããŠè©³çްã確èªããŠãã ããã
ObjectInputã€ã³ã¿ãã§ãŒã¹ã¯ããªããžã§ã¯ãåãåºããžã®abstractã¹ããªãŒã ã»ããŒã¹ã»ã€ã³ã¿ãã§ãŒã¹ãæäŸããŸãã DataInputã€ã³ã¿ãã§ãŒã¹ã®æ¡åŒµãªã®ã§ããã®ã€ã³ã¿ãã§ãŒã¹ã®ããªããã£ãã»ããŒã¿åãèªã¿èŸŒãã¡ãœãããå©çšã§ããŸãã
package java.io;
public interface ObjectInput extends DataInput
{
public Object readObject()
throws ClassNotFoundException, IOException;
public int read() throws IOException;
public int read(byte b[]) throws IOException;
public int read(byte b[], int off, int len) throws IOException;
public long skip(long n) throws IOException;
public int available() throws IOException;
public void close() throws IOException;
}
readObjectã¡ãœããã¯ããªããžã§ã¯ããèªã¿èŸŒãã§è¿ãããã«äœ¿çšããŸãã ã¹ããŒãããäŸå€ã¯ããªããžã§ã¯ãããã®ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããŠãããšãã«èµ·ãã£ããšã©ãŒããã¹ãã¬ãŒãžããèªã¿èŸŒãã§ãããšãã«èµ·ãã£ãäŸå€ã衚ããŠããŸãã äœããã®äŸå€ãã¹ããŒãããå Žåããã®ã¹ãã¬ãŒãžãç ŽæããŠããå¯èœæ§ããããŸãã ãã®ãããªäºæ
ãçºçããå Žåã¯ããã®ã€ã³ã¿ãã§ãŒã¹ãå®è£
ããŠãããªããžã§ã¯ããåç
§ããŠè©³çްã確èªããŠãã ããã
Serializableã€ã³ã¿ãã§ãŒã¹ã¯ãçŽååå¯èœãããã³ã«ãå®è£
ããã¯ã©ã¹ãèå¥ããããã«å®çŸ©ãããŸãã
package java.io;
public interface Serializable {};
Serializableã¯ã©ã¹ã®èŠä»¶ã¯ä»¥äžã®ãšããã§ãã
java.io.Serializableã€ã³ã¿ãã§ãŒã¹ãå®è£
ããserialPersistentFieldsã¡ã³ããŒã䜿ã£ãŠãã£ãŒã«ããæç€ºçã«çŽååå¯èœãšå®£èšããããtransientããŒã¯ãŒãã䜿ã£ãŠéçŽååå¯èœãã£ãŒã«ããæå®ãã)writeObjectã¡ãœãã - ã©ã®æ
å ±ãä¿åãããå¶åŸ¡ããããè¿œå æ
å ±ãã¹ããªãŒã ã«ä»å ãããããreadObjectã¡ãœãã - 察å¿ããwriteObjectã¡ãœããã§æžã蟌ãŸããæ
å ±ãèªã¿èŸŒãã ãã埩å
åŸã®ãªããžã§ã¯ãã®ç¶æ
ãæŽæ°ãããããwriteReplaceã¡ãœãã - ã¯ã©ã¹ããã¹ããªãŒã ã«æžã蟌ãŸãã眮æãªããžã§ã¯ããæå®ã§ããreadResolveã¡ãœãã - ã¯ã©ã¹ããã¹ããªãŒã ããèªã¿èŸŒãŸããã°ããã®ãªããžã§ã¯ãã®çœ®æãªããžã§ã¯ããæå®ã§ããObjectOutputStreamããã³ObjectInputStreamã䜿çšãããšãæäœå¯Ÿè±¡ã®çŽååå¯èœã¯ã©ã¹ãå±éã§ããŸã(以åã®ããŒãžã§ã³ã®ã¯ã©ã¹ãšã®äºææ§ãæã€ã¯ã©ã¹ãžã®å€æŽãå¯èœ)ã äºææ§ãä¿ã€å€æŽã«äœ¿çšã§ããã¡ã«ããºã ã«ã€ããŠã®è©³çްã¯ãã»ã¯ã·ã§ã³5.5ãäºææ§ã®ããJavaTMã®åå±éããåç
§ããŠãã ããã
javac (ãŸãã¯ãã®ä»ã®JavaTMã³ã³ãã€ã©)ã«ãã£ãŠçæãããåæãã£ãŒã«ãã¯ãå®è£
ã«äŸåããã®ã§ãã³ã³ãã€ã©ã«ãã£ãŠçžéãçããããšããããŸãããã®ãããªãã£ãŒã«ãã®çžéã«ãããããã©ã«ãã®serialVersionUIDå€ãç«¶åããã®ã¿ã§ãªããäºææ§ãæãªãããå¯èœæ§ããããŸãã ããŒã«ã«ããã³å¿åã®å
éšã¯ã©ã¹ã«å²ãåœãŠãããååãå®è£
ã«äŸåããã®ã§ãã³ã³ãã€ã©ã«ãã£ãŠçžéãçããå¯èœæ§ããããŸãã å
éšã¯ã©ã¹ã¯ãã³ã³ãã€ã«æå®æ°ãã£ãŒã«ã以å€ã®staticã¡ã³ããŒã宣èšã§ããªãã®ã§ãserialPersistentFieldsã¡ã«ããºã ã䜿çšããŠçŽååå¯èœãã£ãŒã«ããæå®ã§ããŸããã ããã«ãå€éšã€ã³ã¹ã¿ã³ã¹ã«é¢é£ä»ããããå
éšã¯ã©ã¹ã¯ãåŒæ°ãªãã®ã³ã³ã¹ãã©ã¯ã¿(ãã®ãããªå
éšã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¯ãå
å
ããã€ã³ã¹ã¿ã³ã¹ãä»å ãã©ã¡ãŒã¿ãšããŠæé»çã«åãå
¥ãã)ãæããªããããExternalizableãå®è£
ã§ããŸããã ãã ããåè¿°ã®åé¡ã¯ãããããstaticã¡ã³ããŒã»ã¯ã©ã¹ã«ã¯åœãŠã¯ãŸããŸããã
Externalizableã€ã³ã¿ãã§ãŒã¹ã¯ã次ã®ããã«å®çŸ©ãããŸãã
package java.io;
public interface Externalizable extends Serializable
{
public void writeExternal(ObjectOutput out)
throws IOException;
public void readExternal(ObjectInput in)
throws IOException, java.lang.ClassNotFoundException;
}
Externalizableãªããžã§ã¯ãã®ã¯ã©ã¹ã®èŠä»¶ã¯ã以äžã®ãšããã§ãã
java.io.Externalizableã€ã³ã¿ãã§ãŒã¹ãå®è£
ããwriteExternalã¡ãœãããå®è£
ããŠãªããžã§ã¯ãã®ç¶æ
ãä¿åããreadExternalã¡ãœãããå®è£
ããŠãwriteExternalã¡ãœããã«ãã£ãŠæžã蟌ãŸããããŒã¿ãã¹ããªãŒã ããèªã¿åã£ãŠããªããžã§ã¯ãã®ç¶æ
ã埩å
ããwriteExternalãšreadExternalã¡ãœããã®ã¿ããã©ãŒãããã«è²¬ä»»ãæã€(å€éšã§å®çŸ©ããããã©ãŒããããæžã蟌ãŸããå Žå)writeExternalããã³readExternalã¡ãœããã¯publicã§ãããã¯ã©ã€ã¢ã³ãããã¡ãœãããšãã£ãŒã«ãã䜿ããã«ãªããžã§ã¯ãå
ã§æ
å ±ãæžã蟌ãã ãèªã¿èŸŒãã ãã§ããå±éºæ§ããããŸãã ãããã®ã¡ãœããã䜿ãã®ã¯ããªããžã§ã¯ããä¿æããæ
å ±ãæ©å¯ã§ãªããšãããŸãã¯ãããå
¬éããŠãã»ãã¥ãªãã£ã»ãªã¹ã¯ãçºçããªããšãã ãã«ããªããã°ãããŸããã
Externalizableã€ã³ã¿ãã§ãŒã¹ã»ã¡ã«ããºã ãå
éšã¯ã©ã¹ã«äœ¿çšã§ããŸãããå
éšã¯ã©ã¹ãçŽååããå¿
èŠãããå Žåã«ã¯ãSerializableã€ã³ã¿ãã§ãŒã¹ãå®è£
ããããã«ããŠãã ããã ãã ããçŽååå¯èœãªå
éšã¯ã©ã¹ã®å Žåã§ããããã€ãã®å¶éäºé
ããããŸãããã®è©³çްã¯ã1.10é
ãSerializableã€ã³ã¿ãã§ãŒã¹ããåç
§ããŠãã ããã
writeReplaceã¡ãœãã - ã¯ã©ã¹ããã¹ããªãŒã ã«æžã蟌ãŸãã眮æãªããžã§ã¯ããæå®ã§ããreadResolveã¡ãœãã - ã¯ã©ã¹ããã¹ããªãŒã ããèªã¿èŸŒãŸããã°ããã®ãªããžã§ã¯ãã®çœ®æãªããžã§ã¯ããæå®ã§ããObjectOutputStreamã¯enum宿°ã®nameã¡ãœããã§è¿ãããå€ãæžã蟌ã¿ãŸãã enum宿°ãçŽåå埩å
ããããã«ãObjectInputStreamã¯ã¹ããªãŒã ãã宿°åãèªã¿åããŸããçŽåå埩å
ããã宿°ã¯ã宿°ã®enumåãšåãåã£ã宿°åãåŒæ°ãšããŠæž¡ãjava.lang.Enum.valueOfã¡ãœãããåŒã³åºãããšã§ååŸãããŸãã ä»ã®çŽååå¯èœãŸãã¯å€éšåå¯èœãªããžã§ã¯ããšåæ§ã«ãenum宿°ã¯çŽååã¹ããªãŒã ã«ãã®åŸåºçŸããåŸæ¹åç
§ã®ã¿ãŒã²ãããšããŠæ©èœã§ããŸãã
enum宿°ãçŽååããããã»ã¹ã¯ã«ã¹ã¿ãã€ãºã§ããŸãããenumåã§å®çŸ©ãããã¯ã©ã¹åºæã®writeObjectãreadObjectãreadObjectNoDataãwriteReplaceãreadResolveã¡ãœããã¯ãçŽååããã³çŽåå埩å
ã®éã¯ç¡èŠãããŸãã åæ§ã«ãserialPersistentFieldsãŸãã¯serialVersionUIDãã£ãŒã«ã宣èšããã¹ãŠç¡èŠãããŸãããã¹ãŠã®enumåã¯0Lã®åºå®ãããserialVersionUIDãæã¡ãŸãã éä¿¡ãããããŒã¿ã®åã«ã¯ããªãšãŒã·ã§ã³ããªããããenumåã®çŽååå¯èœãªãã£ãŒã«ãããã³ããŒã¿ãããã¥ã¡ã³ãåããå¿
èŠã¯ãããŸããã
ãã£ãšãç°¡åãªææ³ã¯ãæ©å¯ããŒã¿ãå«ããã£ãŒã«ããprivate transientãšããããšã§ãã transientãã£ãŒã«ãã¯ãæ°žç¶çã§ã¯ãªããæ°žç¶æ§ã¡ã«ããºã ã«ãã£ãŠä¿åãããŸããã ãã£ãŒã«ãããã®ããã«ãããšããã®ç¶æ ãã¹ããªãŒã ã«çŸããããçŽåå埩å ã®éã«ã埩å ãããŸããã (privateãã£ãŒã«ãã®)æžã蟌ã¿ãèªèŸŒã¿ãã¯ã©ã¹ã®å€éšã§è¡ãããšã¯ã§ããªãã®ã§ãã¯ã©ã¹ã®transientãã£ãŒã«ãã¯å®å šã§ãã
ç¹ã«æ©å¯æ§ã®é«ãã¯ã©ã¹ã¯ãäžåçŽååãã¹ãã§ã¯ãããŸããã ãããå®çŸããã«ã¯ããªããžã§ã¯ãã¯SerializableãExternalizableã€ã³ã¿ãã§ãŒã¹ãå®è£
ããã¹ãã§ã¯ãããŸããã
ã¯ã©ã¹ã«ãã£ãŠã¯ãæžã蟌ã¿ãèªèŸŒã¿ã¯èš±å¯ããããã©ããçŽåå埩å
ã®éã«ç¶æ
ãæç€ºçã«åŠçããŠåæ€èšŒããæ¹ã䟿å©ãªããšããããŸãã ã¯ã©ã¹ã¯ãé©åãªç¶æ
ã ããä¿ç®¡ããã³åŸ©å
ããwriteObjectããã³readObjectã¡ãœãããå®è£
ãã¹ãã§ãã ã¢ã¯ã»ã¹ãæåŠãã¹ãå Žåã«ã¯ãNotSerializableExceptionãã¹ããŒããããšã§ããã以äžã®ã¢ã¯ã»ã¹ãé²ããŸãã