| ç®æ¬¡|å|次 | Javaãªããžã§ã¯ãçŽåå仿§ Version 6.0 |
第2ç« |
ãããã¯:
ObjectOutputStreamã¯ããªããžã§ã¯ãçŽååãå®è£
ããŸãã ãã®ã¯ã©ã¹ã¯ããã§ã«çŽååããããªããžã§ã¯ãã»ã»ãããå«ããŠãã¹ããªãŒã ã®ç¶æ
ãä¿æããŸãã ãã®ã¡ãœããã¯ãæå®ããããªããžã§ã¯ããšããããåç
§ãããªããžã§ã¯ããä¿åããããã«ãçŽååãããªããžã§ã¯ãã®ãã©ããŒãµã«ãå¶åŸ¡ããŸãã
package java.io;
public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants
{
public ObjectOutputStream(OutputStream out)
throws IOException;
public final void writeObject(Object obj)
throws IOException;
public void writeUnshared(Object obj)
throws IOException;
public void defaultWriteObject()
throws IOException, NotActiveException;
public PutField putFields()
throws IOException;
public writeFields()
throws IOException;
public void reset() throws IOException;
protected void annotateClass(Class cl) throws IOException;
protected void writeClassDescriptor(ObjectStreamClass desc)
throws IOException;
protected Object replaceObject(Object obj) throws IOException;
protected boolean enableReplaceObject(boolean enable)
throws SecurityException;
protected void writeStreamHeader() throws IOException;
public void write(int data) 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;
protected void drain() throws IOException;
public void close() throws IOException;
public void writeBoolean(boolean data) throws IOException;
public void writeByte(int data) throws IOException;
public void writeShort(int data) throws IOException;
public void writeChar(int data) throws IOException;
public void writeInt(int data) throws IOException;
public void writeLong(long data) throws IOException;
public void writeFloat(float data) throws IOException;
public void writeDouble(double data) throws IOException;
public void writeBytes(String data) throws IOException;
public void writeChars(String data) throws IOException;
public void writeUTF(String data) throws IOException;
// Inner class to provide access to serializable fields.
abstract static public class PutField
{
public void put(String name, boolean value)
throws IOException, IllegalArgumentException;
public void put(String name, char data)
throws IOException, IllegalArgumentException;
public void put(String name, byte data)
throws IOException, IllegalArgumentException;
public void put(String name, short data)
throws IOException, IllegalArgumentException;
public void put(String name, int data)
throws IOException, IllegalArgumentException;
public void put(String name, long data)
throws IOException, IllegalArgumentException;
public void put(String name, float data)
throws IOException, IllegalArgumentException;
public void put(String name, double data)
throws IOException, IllegalArgumentException;
public void put(String name, Object data)
throws IOException, IllegalArgumentException;
}
public void useProtocolVersion(int version) throws IOException;
protected ObjectOutputStream()
throws IOException;
protected writeObjectOverride()
throws NotActiveException, IOException;
}
åäžåŒæ°ã®ObjectOutputStreamã³ã³ã¹ãã©ã¯ã¿ã¯ãæå®ãããOutputStreamã«ãªããžã§ã¯ããçŽååããObjectOutputStreamãäœæããŸãã ãã®ã³ã³ã¹ãã©ã¯ã¿ã¯ãwriteStreamHeaderãåŒã³åºããŠãããžãã¯çªå·ãšããŒãžã§ã³ãã¹ããªãŒã ã«æžã蟌ã¿ãŸãããã®ã¹ããªãŒã ã¯ãåäžåŒæ°ã®ObjectInputStreamã³ã³ã¹ãã©ã¯ã¿ã®å¯Ÿå¿ããreadStreamHeaderåŒåºãã«ãã£ãŠèªã¿åãããæ€æ»ãããŸãã ã»ãã¥ãªãã£ã»ãããŒãžã£ãã€ã³ã¹ããŒã«ãããŠããå Žåããã®ã³ã³ã¹ãã©ã¯ã¿ã¯ã"enableSubclassImplementation" SerializablePermissionãputFieldsã¡ãœãããŸãã¯writeUnsharedã¡ãœããããããã¯ãã®äž¡æ¹ããªãŒããŒã©ã€ããããµãã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã«ãã£ãŠçŽæ¥ãŸãã¯éæ¥ã«åŒã³åºããããšãã«ãããããã§ãã¯ããŸãã
writeObjectã¡ãœããã¯ããªããžã§ã¯ããã¹ããªãŒã ã«çŽååããããã«äœ¿çšããŸãã ãªããžã§ã¯ãã¯ã次ã®ããã«çŽååãããŸãã
| 1. | ãµãã¯ã©ã¹ãå®è£
ããªãŒããŒã©ã€ãããå Žåã¯ãwriteObjectOverrideã¡ãœãããåŒã³åºããŠããã埩垰ããŸãã å®è£
ã®ãªãŒããŒã©ã€ãã¯ããã®ã»ã¯ã·ã§ã³ã®æåŸã§èª¬æããŸãã |
| 2. | ãããã¯ã»ããŒã¿ã»ãããã¡ã«ããŒã¿ãããã°ããããã¹ããªãŒã ã«æžã蟌ãŸãããããã¡ããªã»ãããããŸãã |
| 3. | ãªããžã§ã¯ããnullã§ããã°ãnullãã¹ããªãŒã ã«çœ®ãããwriteObjectã¯åŸ©åž°ããŸãã |
| 4. | ã¹ããã8ã§èª¬æãããŠããããã«ããªããžã§ã¯ãã以åã«çœ®ãæããããŠããã°ã眮æãã®ãã³ãã«ãã¹ããªãŒã ã«æžã蟌ã¿ãwriteObjectã¯åŸ©åž°ããŸãã |
| 5. | ãªããžã§ã¯ããã¹ããªãŒã ã«ãã§ã«æžã蟌ãŸããŠããã°ããã®ãã³ãã«ãã¹ããªãŒã ã«æžã蟌ãŸããwriteObjectã¯åŸ©åž°ããŸãã |
| 6. | ãªããžã§ã¯ããClassã§ããã°ã察å¿ããObjectStreamClassãã¹ããªãŒã ã«æžã蟌ãŸãããã®ã¯ã©ã¹ã®ãã³ãã«ãå²ãåœãŠãããwriteObjectã¯åŸ©åž°ããŸãã |
| 7. | ãªããžã§ã¯ããObjectStreamClassã®å Žåããã®ãªããžã§ã¯ãã¯4.3é
ã§èª¬æããã¯ã©ã¹èšè¿°åã®åœ¢åŒã®1ã€ã䜿çšããŠã¹ããªãŒã ã«æžã蟌ãŸããåŸããã³ãã«ãå²ãåœãŠãããŸãã Version 1.3以éã®Java 2 SDK, Standard Editionã§ã¯ãwriteClassDescriptorã¡ãœãããObjectStreamClass (ãã€ãããã¯ã»ãããã·ã»ã¯ã©ã¹ä»¥å€ã®ã¯ã©ã¹ã衚ãå Žåãé¢é£ä»ããããClassãªããžã§ã¯ããjava.lang.reflect.Proxyã®isProxyClassã¡ãœããã«æž¡ãããšã«ãã£ãŠå€å¥ããã)ãåºåããããã«åŒã³åºãããŸãã ãã®åŸã衚ãããã¯ã©ã¹ã®æ³šéãæžã蟌ãŸããŸããã¯ã©ã¹ããã€ãããã¯ã»ãããã·ã»ã¯ã©ã¹ã§ããã°ãannotateProxyClassã¡ãœãããåŒã³åºãããããã§ãªãå Žåã¯annotateClassã¡ãœãããåŒã³åºãããŸãã writeObjectã¡ãœãããæ»ããŸãã |
| 8. | ãªããžã§ã¯ãã®ã¯ã©ã¹ãŸãã¯ObjectInputStreamã®ãµãã¯ã©ã¹(ãããã¯ãã®äž¡æ¹)ã«ããæœåšçãªçœ®æãåŠçããŸãã |
| a. | ãªããžã§ã¯ãã®ã¯ã©ã¹ãenumåã§ãªãããŸãé©åãªwriteReplaceã¡ãœãããå®çŸ©ããå Žåã¯ããã®ã¡ãœãããåŒã³åºãããŸãã 眮æãªããžã§ã¯ããæ»ããŠçŽååããããšãã§ããŸãã |
| b. | enableReplaceObjectã¡ãœããã®åŒåºãã«ããreplaceObjectã¡ãœãããæå¹ã«èšå®ãããŠããå Žåããã®ã¡ãœãããåŒã³åºãããšã«ãããçŽååäžã®ãªããžã§ã¯ããObjectOutputStreamã®ãµãã¯ã©ã¹ã§çœ®æã§ããŸãã åã®ã¹ãããã§å
ã®ãªããžã§ã¯ãã眮ãæããå Žåã¯ã眮æãªããžã§ã¯ãã§replaceObjectã¡ãœãããåŒã³åºãããŸãã |
| äžèšã®äžæ¹ãŸãã¯äž¡æ¹ã®ã¹ãããã§å ã®ãªããžã§ã¯ãã眮ãæããå Žåãå ã®ãªããžã§ã¯ããã眮æãªããžã§ã¯ããžã®ãããã³ã°ã(ã¹ããã4ã§å©çšããããã«)èšé²ãããŸãã ãã®åŸãæ°èŠãªããžã§ã¯ãã«å¯Ÿããã¹ããã3ãã7ãç¹°ãè¿ãããŸãã |
| 眮æãªããžã§ã¯ãããã¹ããã3ãã7ãé©çšã§ããªãåã®å Žåãã¹ããã10ã§çœ®æãªããžã§ã¯ãã䜿ã£ãåŠçãåéãããŸãã |
| 9. | ãªããžã§ã¯ããjava.lang.String,ã®å Žåãæååã¯é·ãã®æ
å ±ãšããŠæžã蟌ãŸãããã®æ
å ±ã®ããšã«Modified UTF-8ã§ãšã³ã³ãŒããããæååã®å
容ãç¶ããŸãã 詳现ã¯ãã»ã¯ã·ã§ã³6.2ãã¹ããªãŒã èŠçŽ ããåç
§ããŠãã ããã ãã³ãã«ãæååã«å²ãåœãŠãããwriteObjectãæ»ããŸãã |
| 10. | ãªããžã§ã¯ããé
åã®å ŽåãwriteObjectãååž°çã«åŒã³åºãããŠãé
åã®ObjectStreamClassãæžã蟌ãŸããŸãã é
åçšã®ãã³ãã«ãå²ãåœãŠãããŸãã ãã®ããšã«é
åã®é·ããç¶ããŸãã ãã®åŸãé
åã®åèŠçŽ ãã¹ããªãŒã ã«æžã蟌ãŸããŠãwriteObjectãæ»ããŸãã |
| 11. | ãªããžã§ã¯ããenum宿°ã§ããã°ãwriteObjectãååž°çã«åŒã³åºãããšã«ãã£ãŠãenumåã®å®æ°ã®ObjectStreamClassãæžã蟌ãŸããŸãã ã¹ããªãŒã å
ã§ã¯ãã¯ãããŠåç
§ããããšãã®ã¿åºçŸããŸãã enum宿°ã®ãã³ãã«ãå²ãåœãŠãããŸãã æ¬¡ã«ãã¹ããã9ã§èª¬æããããã«ãenum宿°ã®nameã¡ãœããã§è¿ãããå€ãStringãªããžã§ã¯ããšããŠæžã蟌ãŸããŸãã ã¹ããªãŒã å
ã«ãã§ã«åãååã®æååãåºçŸããå Žåã«ã¯ããããžã®éåç
§ãæžã蟌ãŸããŸãã writeObjectã¡ãœãããæ»ããŸãã |
| 12. | æ£èŠãªããžã§ã¯ãã®å ŽåãwriteObjectãååž°çã«åŒã³åºãããšã«ãã£ãŠããªããžã§ã¯ãã®ã¯ã©ã¹ã®ObjectStreamClassãæžã蟌ãŸããŸãã ã¹ããªãŒã å
ã§ã¯ãã¯ãããŠåç
§ããããšãã®ã¿åºçŸããŸãã ãã®ãªããžã§ã¯ãçšã®ãã³ãã«ãå²ãåœãŠãããŸãã |
| 13. | ãªããžã§ã¯ãã®å 容ããã¹ããªãŒã ã«æžã蟌ãŸããŸãã |
| a. | ãªããžã§ã¯ããçŽååå¯èœã®å Žåããã£ãšãçŽååå¯èœãªã¯ã©ã¹ãç¹å®ãããŸãã ãã®ã¯ã©ã¹ãããã³æŽŸçããã¯ã©ã¹ããšã«ããã®ã¯ã©ã¹ã®ãã£ãŒã«ããæžã蟌ãŸããŸãã ã¯ã©ã¹ãwriteObjectã¡ãœãããæããªãå Žåã¯ãdefaultWriteObjectã¡ãœãããåŒã³åºãããŠãçŽååå¯èœãã£ãŒã«ããã¹ããªãŒã ã«æžã蟌ãŸããŸãã ã¯ã©ã¹ãwriteObjectã¡ãœãããæã€å Žåã¯ããã®ã¡ãœãããåŒã³åºãããŸãã defaultWriteObjectãŸãã¯putFieldsãšwriteFieldsãåŒã³åºããŠããªããžã§ã¯ãã®ç¶æ
ãä¿åããŠããã»ãã®æ
å ±ãã¹ããªãŒã ã«æžã蟌ãã§ãããŸããŸããã |
| b. | ãªããžã§ã¯ããå€éšåå¯èœãªå Žåããªããžã§ã¯ãã®writeExternalã¡ãœãããåŒã³åºãããŸãã |
| c. | ãªããžã§ã¯ããçŽååå¯èœã§ãå€éšåå¯èœã§ããªãå ŽåãNotSerializableExceptionãã¹ããŒãããŸãã |
äŸå€ã¯ããã©ããŒãµã«äžã«çºçããå Žåããåºã«ãªãã¹ããªãŒã å
ã§çºçããå ŽåããããŸãã IOExceptionã®ãµãã¯ã©ã¹ã®å ŽåãäŸå€ãããã³ã«ã䜿ã£ãŠäŸå€ãã¹ããªãŒã ã«æžã蟌ãŸããã¹ããªãŒã ç¶æ
ãç Žæ£ãããŸãã æåã®äŸå€ãã¹ããªãŒã ã«æžã蟌ãã§ããéã«2çªç®ã®IOExceptionãã¹ããŒãããå Žåãã¹ããªãŒã ã¯äžæç¶æ
ã®ãŸãŸã«ãªããwriteObjectããStreamCorruptedExceptionãã¹ããŒãããŸãã ãã®ä»ã®äŸå€ã®å Žåãã¹ããªãŒã ã¯äžæ¢ãããäžæã§äœ¿çšäžèœãªç¶æ
ã®ãŸãŸã«ãªããŸãã
writeUnsharedã¡ãœããã¯ããéå
±æããªããžã§ã¯ããObjectOutputStreamã«æžã蟌ã¿ãŸãã ãã®ã¡ãœããã¯writeObjectãšåæ§ã§ãããæå®ããããªããžã§ã¯ããåžžã«ã¹ããªãŒã å
ã§äžæãªæ°ãããªããžã§ã¯ããšããŠæžã蟌ã¿ãŸã(以åã«çŽååãããã€ã³ã¹ã¿ã³ã¹ãæãéåç
§ãšããŠã§ã¯ãªã)ã å
·äœçã«ã¯ã次ã®ããã«ãªããŸãã
writeUnsharedã䜿çšããŠæžã蟌ãŸãããªããžã§ã¯ãã¯ããã®ãªããžã§ã¯ãã以åã«æžã蟌ãŸããŠãããã©ããã«ããããããåžžã«æ°ããåºçŸãããªããžã§ã¯ã(ã¹ããªãŒã ã«ãŸã æžã蟌ãŸããããšããªããªããžã§ã¯ã)ãšããŠåãæ¹æ³ã§çŽååãããŸããwriteUnsharedã«ãã£ãŠä»¥åã«æžã蟌ãŸãããªããžã§ã¯ããæžã蟌ãéã«writeObjectã䜿çšãããšã以åã®writeUnsharedæäœã¯ãå¥ã®ãªããžã§ã¯ãã®æžã蟌ã¿ãšããŠæ±ãããŸãã ã€ãŸããObjectOutputStreamã¯ãwriteUnsharedåŒåºãã«ãã£ãŠæžã蟌ãŸãããªããžã§ã¯ãã»ããŒã¿ãžã®éåç
§ãçæããŸããã writeUnsharedãä»ããŠãªããžã§ã¯ããæžã蟌ãããšèªäœã¯ãçŽåå埩å
ããããšãã«ãã®ãªããžã§ã¯ããžã®äžæåç
§ãä¿èšŒãããã®ã§ã¯ãããŸãããã1ã€ã®ãªããžã§ã¯ããã¹ããªãŒã å
ã§è€æ°åå®çŸ©ãããããšã¯å¯èœã«ãªãã®ã§ãåãåãåŽãObjectInputStream.readUnsharedã¡ãœãã(ã»ã¯ã·ã§ã³3.1ãObjectInputStreamã¯ã©ã¹ããåç
§)ãè€æ°ååŒã³åºããŠãç«¶åããŸããã ããã§èª¬æããèŠåã¯ãwriteUnsharedã«ãã£ãŠæžã蟌ãŸããåºæ¬ã¬ãã«ã®ãªããžã§ã¯ãã ãã«é©çšãããçŽååããããªããžã§ã¯ãã»ã°ã©ãå
ã§æšç§»çã«åç
§ããããµããªããžã§ã¯ãã«ã¯é©çšãããŸããã
defaultWriteObjectã¡ãœããã¯ãçŸåšã®ã¯ã©ã¹ã«å¯Ÿããããã©ã«ãçŽååã¡ã«ããºã ãå®è£
ããŸãã ãã®ã¡ãœããã®åŒåºãã¯ãã¯ã©ã¹ã®writeObjectã¡ãœããããã®ã¿å¯èœã§ãã ãã®ã¡ãœããã¯ãçŸåšã®ã¯ã©ã¹ã®ãã¹ãŠã®çŽååå¯èœãã£ãŒã«ããã¹ããªãŒã ã«æžã蟌ã¿ãŸãã writeObjectã¡ãœããã®å€éšãããã®ã¡ãœãããåŒã³åºããããšãNotActiveExceptionãã¹ããŒãããŸãã
putFieldsã¡ãœããã¯ãã¹ããªãŒã å
ã®çŽååå¯èœãã£ãŒã«ãã®å€ãèšå®ããéã«åŒåºãåŽã䜿çšããPutFieldãªããžã§ã¯ããè¿ããŸãã ãã£ãŒã«ãã¯ãä»»æã®é åºã§èšå®ã§ããŸãã ãã¹ãŠã®ãã£ãŒã«ãã®èšå®ãå®äºããããwriteFieldsãåŒã³åºããŠããã£ãŒã«ãå€ãæ£èŠã®é åºã§ã¹ããªãŒã ã«æžã蟌ãå¿
èŠããããŸãã ãã£ãŒã«ããèšå®ãããŠããªãå Žåããã®åã«é©ããããã©ã«ãå€ãã¹ããªãŒã ã«æžã蟌ãŸããŸãã ãã®ã¡ãœããã¯ãçŽååå¯èœã¯ã©ã¹ã®writeObjectã¡ãœããå
ããããåŒã³åºãããšãã§ããŸããã ãŸãããã®ã¡ãœããã¯ã1åããåŒã³åºãããšãã§ãããdefaultWriteObjectããã§ã«åŒã³åºãããŠããå Žåã¯åŒã³åºããŸããã writeFieldsãåŒã³åºããããšã§ãªããšãã»ãã®ããŒã¿ãã¹ããªãŒã ã«æžã蟌ãããšã¯ã§ããŸããã
resetã¡ãœããã¯ãã¹ããªãŒã ç¶æ
ããªã»ããããŠãæ§ç¯æã®ç¶æ
ã«æ»ããŸãã Resetã¯ããã§ã«ã¹ããªãŒã ã«æžã蟌ãŸãããªããžã§ã¯ãã®ç¶æ
ãç Žæ£ããŸãã ã¹ããªãŒã å
ã®çŸåšäœçœ®ã«ãªã»ããã®ããŒã¯ãä»ããããã®ã§ã察å¿ããObjectInputStreamãåãäœçœ®ã§ãªã»ãããããŸãã 以åã«ã¹ããªãŒã ã«æžã蟌ãŸãããªããžã§ã¯ãããã¹ããªãŒã ã«æžèŸŒã¿æžã¿ã®ãªããžã§ã¯ããšããŠèšæ¶ãããããšã¯ãããŸããã ãããã®ãªããžã§ã¯ãã¯ãã¹ããªãŒã ã«å床æžã蟌ãŸããŸãã ããã¯ããªããžã§ã¯ãã®å
容ããªããžã§ã¯ããåéä¿¡ããªããã°ãããªãå Žåã«æçšã§ãã Resetã¯ããªããžã§ã¯ãã®çŽååäžã¯åŒã³åºãããªãå ŽåããããŸãã äžæ£ã«åŒã³åºããããšãIOExceptionãã¹ããŒãããŸãã
Java 2 SDK, Standard Edition, v1.3ãããObjectStreamClassã®çŽååãå¿
èŠã«ãªããšãwriteClassDescriptorã¡ãœãããåŒã³åºãããããã«ãªããŸãããwriteClassDescriptorã¯ãObjectStreamClass衚çŸã®çŽååã¹ããªãŒã ãžã®æžèŸŒã¿ãæ
åœããŸãã ãµãã¯ã©ã¹ã§ãã®ã¡ãœããããªãŒããŒã©ã€ãããããšã«ãããã¯ã©ã¹èšè¿°åã®çŽååã¹ããªãŒã ãžã®æžèŸŒã¿æ¹æ³ãã«ã¹ã¿ãã€ãºã§ããŸãã ãã®ã¡ãœããããªãŒããŒã©ã€ãããå Žåã¯ãObjectInputStreamå
ã®å¯Ÿå¿ããreadClassDescriptorã¡ãœããããªãŒããŒã©ã€ãããŠãã«ã¹ã¿ã ã»ã¹ããªãŒã 衚çŸããã¯ã©ã¹èšè¿°åãåæ§æããããšããèŠãããŸãã ããã©ã«ãã§ã¯ãwriteClassDescriptorã¯ã6.4é
ãã¹ããªãŒã 圢åŒã®ææ³ãã§æå®ããã圢åŒã«åŸã£ãŠã¯ã©ã¹èšè¿°åãæžã蟌ã¿ãŸãã ãã®ã¡ãœããã¯ãObjectOutputStreamãå€ãçŽååã¹ããªãŒã 圢åŒã䜿çšããŠããªãå Žåã«ã®ã¿ãåŒåºãå¯èœã§ã(6.3é
ãã¹ããªãŒã ã»ãããã³ã«ã»ããŒãžã§ã³ããåç
§)ã ãã®çŽååã¹ããªãŒã ãå€ã圢åŒ(ObjectStreamConstants.PROTOCOL_VERSION_1)ã䜿çšããŠããå Žåãã¯ã©ã¹èšè¿°åã¯ãªãŒããŒã©ã€ããŸãã¯ã«ã¹ã¿ãã€ãºãäžå¯èœãªæ¹æ³ã§å
éšçã«æžã蟌ãŸããŸãã
Classã®çŽååäžããã€ã¯ã©ã¹èšè¿°åã®ã¹ããªãŒã ãžã®æžèŸŒã¿åŸã«ãannotateClassã¡ãœãããåŒã³åºãããŸãã ãµãã¯ã©ã¹ããã®ã¡ãœãããç¶æ¿ããŠãã¯ã©ã¹ã«é¢ããã»ãã®æ
å ±ãã¹ããªãŒã ã«æžã蟌ãããšãå¯èœã§ãã ãã®æ
å ±ã®èªåãã¯ã察å¿ããObjectInputStreamãµãã¯ã©ã¹ã®resolveClassã¡ãœããã䜿ã£ãŠå®è¡ããå¿
èŠããããŸãã
ObjectOutputStreamãµãã¯ã©ã¹ã¯ãreplaceObjectã¡ãœãããå®è£
ããããšã«ãããçŽååäžã«ãªããžã§ã¯ãã®ç£èŠããã³çœ®æãå®è¡ã§ããŸãã æåã®çœ®æå¯Ÿè±¡ãªããžã§ã¯ãã«å¯ŸããŠwriteObjectãåŒã³åºãåã«ãenableReplaceObjectãåŒã³åºããŠã眮æãæç€ºçã«æå¹ã«ããå¿
èŠããããŸãã ãªããžã§ã¯ãã®çœ®æãæå¹ã«ãããããšããªããžã§ã¯ããã¯ãããŠçŽååããçŽåã«ãåãªããžã§ã¯ãã«å¯ŸããŠreplaceObjectãåŒã³åºãããŸãã replaceObjectã¡ãœããã¯ãç¹å¥ã«åŠçãããã¯ã©ã¹ã§ããClassããã³ObjectStreamClassã®ãªããžã§ã¯ãã«å¯ŸããŠã¯åŒã³åºãããŸããã ãµãã¯ã©ã¹ã®å®è£
ããå
ã®ãªããžã§ã¯ãã§ã¯ãªãçŽååããã代æ¿ãªããžã§ã¯ããè¿ãå ŽåããããŸãã 代æ¿ãªããžã§ã¯ãã¯ãçŽååå¯èœã§ãªããã°ãããŸããã ã¹ããªãŒã ã«ãããå
ã®ãªããžã§ã¯ããžã®ãã¹ãŠã®åç
§ã¯ã眮æãªããžã§ã¯ãã«ãã£ãŠçœ®ãæããããŸãã
ãµãã¯ã©ã¹ã¯ãªããžã§ã¯ãã眮æãããŠãããšãã«ã眮æããããªããžã§ã¯ããåç
§ãä¿åãããã¹ãŠã®ãã£ãŒã«ããšäºææ§ãæã€ããšãã€ãŸãçŽåå埩å
æã«è£å®çãªçœ®æãè¡ãããããšãä¿èšŒããå¿
èŠããããŸãã åããã£ãŒã«ããŸãã¯é
åèŠçŽ ã®åã®ãµãã¯ã©ã¹ã§ãªããªããžã§ã¯ãã¯ãããšã§ClassCastExceptionãã¹ããŒããŠçŽåå埩å
ãäžæ¢ããããšã«ãªããåç
§ã¯ä¿åãããŸããã
enableReplaceObjectã¡ãœããã¯ãçŽååã®éã«ãããªããžã§ã¯ããå¥ã®ãªããžã§ã¯ãã§çœ®æããããã«ãObjectOutputStreamã®ä¿¡é Œã§ãããµãã¯ã©ã¹ã§åŒã³åºãããšãã§ããŸãã ãªããžã§ã¯ãã®çœ®æã¯ãenableReplaceObjectãtrueå€ã§åŒã³åºããããŸã§ã¯ãç¡å¹ã«ãªã£ãŠããŸãã ãã以éã¯ãfalseã«èšå®ããããšã§ç¡å¹ã«ã§ããŸãã åã®èšå®ãè¿ãããŸãã enableReplaceObjectã¡ãœããã¯ã眮æãèŠæ±ããã¹ããªãŒã ãä¿¡é Œã§ãããã©ããã調ã¹ãŸãã ãªããžã§ã¯ãã®privateç¶æ
ãæå³ããã«å
¬éãããªãããšãä¿èšŒããããã«ãä¿¡é Œã§ããã¹ããªãŒã ã»ãµãã¯ã©ã¹ã ããreplaceObjectã䜿çšã§ããŸãã ä¿¡é Œãããã¯ã©ã¹ãšã¯ãSerializable眮æãæå¹ã«ããæš©éãä¿æãããã»ãã¥ãªãã£ä¿è·ãã¡ã€ã³ã«å±ããã¯ã©ã¹ã®ããšã§ãã
ObjectOutputStreamã®ãµãã¯ã©ã¹ãã·ã¹ãã ã»ãã¡ã€ã³ã®äžéšãšã¯ã¿ãªãããªãå ŽåãSerializablePermission "enableSubstitution"ãã»ãã¥ãªãã£ã»ããªã·ãŒã»ãã¡ã€ã«ã«è¿œå ããå¿
èŠããããŸãã ObjectInputStreamã®ãµãã¯ã©ã¹ã®ä¿è·ãã¡ã€ã³ã«ãenableReplaceObjectåŒåºãã«ãã"enableSubstitution"ã®æš©éããªãå Žåã¯ãAccessControlExceptionãã¹ããŒãããŸãã ã»ãã¥ãªãã£ã»ã¢ãã«ã®è©³çްã¯ãJavaã»ãã¥ãªãã£ã»ã¢ãŒããã¯ãã£(JDK1.2)ã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
writeStreamHeaderã¡ãœããã¯ãããžãã¯çªå·ãšããŒãžã§ã³ãã¹ããªãŒã ã«æžã蟌ã¿ãŸãã ãã®æ
å ±ã¯ãObjectInputStreamã®readStreamHeaderã¡ãœããã䜿ã£ãŠèªã¿åãå¿
èŠããããŸãã ã¹ããªãŒã ã®äžæåœ¢åŒãèå¥ããããã«ããµãã¯ã©ã¹ããã®ã¡ãœãããå®è£
ããããšãå¿
èŠãªå ŽåããããŸãã
flushã¡ãœããã¯ãã¹ããªãŒã ãä¿æãããããã¡ã空ã«ããŠåºã«ãªãã¹ããªãŒã ã«ãã©ãã·ã¥ã転éããããã«ã䜿çšãããŸãã åºã«ãªãã¹ããªãŒã ã®ãã©ãã·ã¥ã匷å¶ããã«ObjectOutputStreamã®ãããã¡ã ãã空ã«ããããã«ããµãã¯ã©ã¹ããdrainã¡ãœããã䜿çšã§ããŸãã
ããªããã£ãåçšã®ãã¹ãŠã®writeã¡ãœããã¯ãDataOutputStreamã䜿ã£ãŠå€ããšã³ã³ãŒãããŠãæšæºã¹ããªãŒã 圢åŒã«ããŸãã ãã€ãããããã¯ã»ããŒã¿ã»ã¬ã³ãŒãã«ãããã¡ãªã³ã°ãããããšã«ããããªããžã§ã¯ãã®ãšã³ã³ãŒãã£ã³ã°ãšã®åºå¥ãå¯èœã«ãªããŸãã ãã®ãããã¡ãªã³ã°ã«ãããã¯ã©ã¹ã®ããŒãžã§ã³ç®¡çãå¿
èŠãªå Žåãããªããã£ãã»ããŒã¿ã®ã¹ããããå¯èœã«ãªããŸãã ãŸããã¯ã©ã¹åºæã®ã¡ãœãããåŒã³åºãããšãªããã¹ããªãŒã ã®æ§æè§£æãè¡ãããšãå¯èœã«ãªããŸãã
çŽååã®å®è£
ããªãŒããŒã©ã€ããããšãã¯ãObjectOutputStreamã®ãµãã¯ã©ã¹ã¯åŒæ°ãªãã®protected ObjectOutputStreamã³ã³ã¹ãã©ã¯ã¿ãåŒã³åºãããšããå§ãããŸãã SerializablePermission "enableSubclassImplementation"çšã®åŒæ°ãªãã³ã³ã¹ãã©ã¯ã¿å
ã§ã¯ãä¿¡é Œã§ããã¯ã©ã¹ã ããããã©ã«ãå®è£
ã®ãªãŒããŒã©ã€ããèš±å¯ãããããã«ã»ãã¥ãªãã£ã»ãã§ãã¯ããããŸãã ãã®ã³ã³ã¹ãã©ã¯ã¿ã¯ãObjectOutputStreamã«privateãªããŒã¿ãå²ãåœãŠããfinal writeObjectã¡ãœãããwriteObjectOverrideã¡ãœãããåŒã³åºããŠãã埩垰ããã¹ãããšã瀺ããã©ã°ãèšå®ããŸãã ã»ãã®ãã¹ãŠã®ObjectOutputStreamã¡ãœããã¯ãfinalã§ã¯ãªãã®ã§ããµãã¯ã©ã¹ã«ãã£ãŠçŽæ¥ãªãŒããŒã©ã€ãã§ããŸãã
ã¯ã©ã¹PutFieldã¯ãããã¯ã©ã¹ãããã©ã«ãçŽååã䜿ããªãå Žåã«ããã®ã¯ã©ã¹ã®çŽååå¯èœãã£ãŒã«ãã®å€ãèšå®ããããã®APIãæäŸããŸãã åã¡ãœããã¯ãæå®ãããååä»ãå€ãã¹ããªãŒã ã«çœ®ããŸãã nameãããã£ãŒã«ããæžã蟌ãŸããŠããã¯ã©ã¹ã®çŽååå¯èœãã£ãŒã«ãã®ååãšäžèŽããªãå ŽåããŸãã¯æå®ããããã£ãŒã«ãã®åããåŒã³åºãããç¹å®ã®putã¡ãœããã®2çªç®ã®ãã©ã¡ãŒã¿ã®åãšäžèŽããªãå ŽåãIllegalArgumentExceptionãã¹ããŒãããŸãã
writeObjectã¡ãœããã«ãã£ãŠãã¯ã©ã¹ã¯ç¬èªã®ãã£ãŒã«ãã®çŽååãå¶åŸ¡ã§ããŸãã ãã®ã·ã°ããã£ã次ã«ç€ºããŸãã
private void writeObject(ObjectOutputStream stream)
throws IOException;
çŽååå¯èœãªããžã§ã¯ãã®åãµãã¯ã©ã¹ã¯ãç¬èªã®writeObjectã¡ãœãããå®çŸ©ã§ããŸãã ã¯ã©ã¹ãã¡ãœãããå®è£
ããªãå Žåã¯ãdefaultWriteObjectã«ãã£ãŠäžããããããã©ã«ãçŽååã䜿çšãããŸãã å®è£
ãããŠããå Žåãã¯ã©ã¹ã«ã¯ããã®ã¹ãŒããŒã»ã¿ã€ãããµãã¿ã€ãã®ãã£ãŒã«ãã§ã¯ãªããç¬èªã®ãã£ãŒã«ããæžã蟌ã責任ã ãããããŸãã
ã¯ã©ã¹ã®writeObjectã¡ãœããã«ã¯ãå®è£
ãããŠããå Žåãã¯ã©ã¹ã®ç¶æ
ãä¿åãã責任ããããŸãã ObjectOutputStreamã®defaultWriteObjectã¡ãœãããŸãã¯writeFieldsã¡ãœãããäžåºŠ(äžåºŠã®ã¿)åŒã³åºããŠããã§ãªããšã察å¿ããreadObjectã¡ãœããããªããžã§ã¯ãã®ç¶æ
ã埩å
ããããã«å¿
èŠãªãªãã·ã§ã³ã»ããŒã¿ãæžã蟌ãããšã¯ã§ããŸããããªãã·ã§ã³ã»ããŒã¿ãæžã蟌ãŸãªãå Žåã§ããdefaultWriteObjectãŸãã¯writeFieldsãäžåºŠåŒã³åºãå¿
èŠããããŸãã ãªãã·ã§ã³ã»ããŒã¿(ããå Žå)ã®æžèŸŒã¿ã®åã«defaultWriteObjectãwriteFieldsãåŒã³åºãããªããã°ãObjectInputStreamããã®writeObjectã¡ãœãããå®çŸ©ããã¯ã©ã¹ã解決ã§ããªãå Žåã«ãã€ã³ã¹ã¿ã³ã¹çŽåå埩å
ã®åäœã¯æªå®çŸ©ã«ãªããŸãã
ãªãã·ã§ã³ã»ããŒã¿ã®åœ¢åŒãæ§é äœãããŒãžã§ã³ç®¡çã®è²¬ä»»ã¯ãå®å šã«ã¯ã©ã¹ã«ãããŸãã
java.io.Externalizableãå®è£
ãããªããžã§ã¯ãã¯ãwriteExternalã¡ãœãããå®è£
ããŠããªããžã§ã¯ãã®ç¶æ
å
šäœãä¿åããå¿
èŠããããŸãã ãã®ãªããžã§ã¯ãã¯ããã®ã¹ãŒããŒã»ã¯ã©ã¹ãšå調ããŠããããã®ç¶æ
ãä¿ç®¡ããªããã°ãããŸããã ObjectOutputã®ãã¹ãŠã®ã¡ãœãããããªããžã§ã¯ãã®ããªããã£ãåãã£ãŒã«ããšãªããžã§ã¯ãã»ãã£ãŒã«ããä¿åããããã«äœ¿çšã§ããŸãã
public void writeExternal(ObjectOutput stream)
throws IOException;
JDK 1.2ã§ãExternalizableããŒã¿ãæžã蟌ãããã®æ°ããããã©ã«ã圢åŒãå°å
¥ãããŸããã æ°ãã圢åŒã¯ãããªããã£ãã»ããŒã¿ãwriteExternalã¡ãœããã«ãã£ãŠãããã¯ã»ããŒã¿ã»ã¢ãŒãã§æžã蟌ãŸããããã«æå®ããŸãã ããã«ãwriteExternalã¡ãœããããæ»ã£ãããšã«ãå€éšãªããžã§ã¯ãã®æ«å°Ÿã瀺ãã¿ã°ãã¹ããªãŒã ã«ä»å ãããŸãã ãã®åœ¢åŒå€æŽã®å©ç¹ã«ã€ããŠã¯ãã»ã¯ã·ã§ã³3.6ãreadExternalã¡ãœããããåç
§ããŠãã ããã ãã®å€æŽã«ããçããäºææ§ã®åé¡ã®è©³çްã¯ãã»ã¯ã·ã§ã³2.6ãuseProtocolVersionã¡ãœããããåç
§ããŠãã ããã
writeReplaceã¡ãœããã¯ããªããžã§ã¯ããæžã蟌ãŸããåã«ããªããžã§ã¯ãã®ã¯ã©ã¹ãã¹ããªãŒã å
ã§ç¬èªã®çœ®æãæå®ããããšãèš±å¯ããŸãã writeReplaceã¡ãœãããå®è£
ããããšã«ãããã¯ã©ã¹ã¯ãçŽååãããŠããç¬èªã®ã€ã³ã¹ã¿ã³ã¹ã®åããã³ã€ã³ã¹ã¿ã³ã¹ãçŽæ¥å¶åŸ¡ã§ããŸãã
ãã®ã¡ãœããã¯ã次ã®ããã«å®çŸ©ãããŸãã
ANY-ACCESS-MODIFIER Object writeReplace() {
throws ObjectStreamException;
ObjectOutputStreamãã¹ããªãŒã ã«ãªããžã§ã¯ããæžãèŸŒãæºåãããŠãããšããwriteReplaceã¡ãœãããåŒã³åºãããŸãã ObjectOutputStreamã¯ãã¯ã©ã¹ãwriteReplaceã¡ãœãããå®çŸ©ããŠãããã©ããããã§ãã¯ããŸãã ãã®ã¡ãœãããå®çŸ©ãããŠããå Žåã¯ããªããžã§ã¯ããã¹ããªãŒã å
ã§çœ®æãæå®ããããšãèš±å¯ããããã«writeReplaceã¡ãœãããåŒã³åºãããŸãã è¿ããããªããžã§ã¯ãã¯ãæž¡ããããªããžã§ã¯ããšåãåã§ãããããŸãã¯èªã¿èŸŒãŸããŠè§£éããããªããžã§ã¯ããããªããžã§ã¯ããžã®ãã¹ãŠã®åç
§ãšäºææ§ãæã€åã®ãªããžã§ã¯ãã§ããã¹ãã§ãã ããã§ãªãå Žåãåã®äžäžèŽãæ€åºããããšãã«ãClassCastExceptionãçºçããŸãã
ã¹ããªãŒã ã»ãããã³ã«ã»ããŒãžã§ã³ã«ã€ããŠã¯ãã»ã¯ã·ã§ã³6.3ãã¹ããªãŒã ã»ãããã³ã«ã»ããŒãžã§ã³ããåç §ããŠãã ããã