001: /*
002: * @(#)Serializable.java 1.24 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package java.io;
029:
030: /**
031: * Serializability of a class is enabled by the class implementing the
032: * java.io.Serializable interface. Classes that do not implement this
033: * interface will not have any of their state serialized or
034: * deserialized. All subtypes of a serializable class are themselves
035: * serializable. The serialization interface has no methods or fields
036: * and serves only to identify the semantics of being serializable. <p>
037: *
038: * To allow subtypes of non-serializable classes to be serialized, the
039: * subtype may assume responsibility for saving and restoring the
040: * state of the supertype's public, protected, and (if accessible)
041: * package fields. The subtype may assume this responsibility only if
042: * the class it extends has an accessible no-arg constructor to
043: * initialize the class's state. It is an error to declare a class
044: * Serializable if this is not the case. The error will be detected at runtime. <p>
045: *
046: * During deserialization, the fields of non-serializable classes will
047: * be initialized using the public or protected no-arg constructor of
048: * the class. A no-arg constructor must be accessible to the subclass
049: * that is serializable. The fields of serializable subclasses will
050: * be restored from the stream. <p>
051: *
052: * When traversing a graph, an object may be encountered that does not
053: * support the Serializable interface. In this case the
054: * NotSerializableException will be thrown and will identify the class
055: * of the non-serializable object. <p>
056: *
057: * Classes that require special handling during the serialization and
058: * deserialization process must implement special methods with these exact
059: * signatures: <p>
060: *
061: * <PRE>
062: * private void writeObject(java.io.ObjectOutputStream out)
063: * throws IOException
064: * private void readObject(java.io.ObjectInputStream in)
065: * throws IOException, ClassNotFoundException;
066: * </PRE><p>
067: *
068: * The writeObject method is responsible for writing the state of the
069: * object for its particular class so that the corresponding
070: * readObject method can restore it. The default mechanism for saving
071: * the Object's fields can be invoked by calling
072: * out.defaultWriteObject. The method does not need to concern
073: * itself with the state belonging to its superclasses or subclasses.
074: * State is saved by writing the individual fields to the
075: * ObjectOutputStream using the writeObject method or by using the
076: * methods for primitive data types supported by DataOutput. <p>
077: *
078: * The readObject method is responsible for reading from the stream and
079: * restoring the classes fields. It may call in.defaultReadObject to invoke
080: * the default mechanism for restoring the object's non-static and non-transient
081: * fields. The defaultReadObject method uses information in the stream to
082: * assign the fields of the object saved in the stream with the correspondingly
083: * named fields in the current object. This handles the case when the class
084: * has evolved to add new fields. The method does not need to concern
085: * itself with the state belonging to its superclasses or subclasses.
086: * State is saved by writing the individual fields to the
087: * ObjectOutputStream using the writeObject method or by using the
088: * methods for primitive data types supported by DataOutput. <p>
089: *
090: * Serializable classes that need to designate an alternative object to be
091: * used when writing an object to the stream should implement this
092: * special method with the exact signature: <p>
093: *
094: * <PRE>
095: * ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
096: * </PRE><p>
097: *
098: * This writeReplace method is invoked by serialization if the method
099: * exists and it would be accessible from a method defined within the
100: * class of the object being serialized. Thus, the method can have private,
101: * protected and package-private access. Subclass access to this method
102: * follows java accessibility rules. <p>
103: *
104: * Classes that need to designate a replacement when an instance of it
105: * is read from the stream should implement this special method with the
106: * exact signature.<p>
107: *
108: * <PRE>
109: * ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
110: * </PRE><p>
111: *
112: * This readResolve method follows the same invocation rules and
113: * accessibility rules as writeReplace.
114: *
115: * @author unascribed
116: * @version 1.17, 05/03/00
117: * @see java.io.ObjectOutputStream
118: * @see java.io.ObjectInputStream
119: * @see java.io.ObjectOutput
120: * @see java.io.ObjectInput
121: * @see java.io.Externalizable
122: * @since JDK1.1
123: */
124: public interface Serializable {
125: }
|