151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.io; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Serializability of a class is enabled by the class implementing the 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.io.Serializable interface. Classes that do not implement this 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interface will not have any of their state serialized or 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * deserialized. All subtypes of a serializable class are themselves 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * serializable. The serialization interface has no methods or fields 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and serves only to identify the semantics of being serializable. <p> 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * To allow subtypes of non-serializable classes to be serialized, the 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * subtype may assume responsibility for saving and restoring the 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * state of the supertype's public, protected, and (if accessible) 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * package fields. The subtype may assume this responsibility only if 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the class it extends has an accessible no-arg constructor to 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initialize the class's state. It is an error to declare a class 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Serializable if this is not the case. The error will be detected at 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * runtime. <p> 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * During deserialization, the fields of non-serializable classes will 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be initialized using the public or protected no-arg constructor of 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the class. A no-arg constructor must be accessible to the subclass 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that is serializable. The fields of serializable subclasses will 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be restored from the stream. <p> 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * When traversing a graph, an object may be encountered that does not 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * support the Serializable interface. In this case the 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * NotSerializableException will be thrown and will identify the class 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the non-serializable object. <p> 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Classes that require special handling during the serialization and 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * deserialization process must implement special methods with these exact 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * signatures: <p> 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <PRE> 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * private void writeObject(java.io.ObjectOutputStream out) 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * throws IOException 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * private void readObject(java.io.ObjectInputStream in) 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * throws IOException, ClassNotFoundException; 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * private void readObjectNoData() 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * throws ObjectStreamException; 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </PRE> 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The writeObject method is responsible for writing the state of the 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object for its particular class so that the corresponding 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * readObject method can restore it. The default mechanism for saving 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the Object's fields can be invoked by calling 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * out.defaultWriteObject. The method does not need to concern 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * itself with the state belonging to its superclasses or subclasses. 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * State is saved by writing the individual fields to the 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ObjectOutputStream using the writeObject method or by using the 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * methods for primitive data types supported by DataOutput. 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The readObject method is responsible for reading from the stream and 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * restoring the classes fields. It may call in.defaultReadObject to invoke 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the default mechanism for restoring the object's non-static and 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * non-transient fields. The defaultReadObject method uses information in 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the stream to assign the fields of the object saved in the stream with the 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * correspondingly named fields in the current object. This handles the case 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * when the class has evolved to add new fields. The method does not need to 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * concern itself with the state belonging to its superclasses or subclasses. 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * State is saved by writing the individual fields to the 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ObjectOutputStream using the writeObject method or by using the 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * methods for primitive data types supported by DataOutput. 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>The readObjectNoData method is responsible for initializing the state of 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the object for its particular class in the event that the serialization 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * stream does not list the given class as a superclass of the object being 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * deserialized. This may occur in cases where the receiving party uses a 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * different version of the deserialized instance's class than the sending 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * party, and the receiver's version extends classes that are not extended by 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the sender's version. This may also occur if the serialization stream has 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * been tampered; hence, readObjectNoData is useful for initializing 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * deserialized objects properly despite a "hostile" or incomplete source 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * stream. 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>Serializable classes that need to designate an alternative object to be 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used when writing an object to the stream should implement this 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * special method with the exact signature: <p> 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <PRE> 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException; 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </PRE><p> 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This writeReplace method is invoked by serialization if the method 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * exists and it would be accessible from a method defined within the 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * class of the object being serialized. Thus, the method can have private, 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * protected and package-private access. Subclass access to this method 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * follows java accessibility rules. <p> 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Classes that need to designate a replacement when an instance of it 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is read from the stream should implement this special method with the 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * exact signature.<p> 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <PRE> 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException; 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </PRE><p> 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This readResolve method follows the same invocation rules and 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accessibility rules as writeReplace.<p> 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The serialization runtime associates with each serializable class a version 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * number, called a serialVersionUID, which is used during deserialization to 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * verify that the sender and receiver of a serialized object have loaded 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * classes for that object that are compatible with respect to serialization. 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the receiver has loaded a class for the object that has a different 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * serialVersionUID than that of the corresponding sender's class, then 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * deserialization will result in an {@link InvalidClassException}. A 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * serializable class can declare its own serialVersionUID explicitly by 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * declaring a field named <code>"serialVersionUID"</code> that must be static, 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * final, and of type <code>long</code>:<p> 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <PRE> 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </PRE> 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If a serializable class does not explicitly declare a serialVersionUID, then 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the serialization runtime will calculate a default serialVersionUID value 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for that class based on various aspects of the class, as described in the 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java(TM) Object Serialization Specification. However, it is <em>strongly 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * recommended</em> that all serializable classes explicitly declare 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * serialVersionUID values, since the default serialVersionUID computation is 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * highly sensitive to class details that may vary depending on compiler 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementations, and can thus result in unexpected 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>InvalidClassException</code>s during deserialization. Therefore, to 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * guarantee a consistent serialVersionUID value across different java compiler 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementations, a serializable class must declare an explicit 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * serialVersionUID value. It is also strongly advised that explicit 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * serialVersionUID declarations use the <code>private</code> modifier where 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * possible, since such declarations apply only to the immediately declaring 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * class--serialVersionUID fields are not useful as inherited members. Array 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * classes cannot declare an explicit serialVersionUID, so they always have 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the default computed value, but the requirement for matching 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * serialVersionUID values is waived for array classes. 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 161d1ce77d790fb9655f09a25afde0b91faf187a74cPrzemyslaw Szczepaniak * Android implementation of serialVersionUID computation will change slightly 162d1ce77d790fb9655f09a25afde0b91faf187a74cPrzemyslaw Szczepaniak * for some classes if you're targeting android N. In order to preserve compatibility, 163d1ce77d790fb9655f09a25afde0b91faf187a74cPrzemyslaw Szczepaniak * this change is only enabled is the application target SDK version is set to 164d1ce77d790fb9655f09a25afde0b91faf187a74cPrzemyslaw Szczepaniak * 24 or higher. It is highly recommended to use an explicit serialVersionUID 165d1ce77d790fb9655f09a25afde0b91faf187a74cPrzemyslaw Szczepaniak * field to avoid compatibility issues. 166d1ce77d790fb9655f09a25afde0b91faf187a74cPrzemyslaw Szczepaniak * 1677f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * <h3>Implement Serializable Judiciously</h3> 1687f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * Refer to <i>Effective Java</i>'s chapter on serialization for thorough 1697f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * coverage of the serialization API. The book explains how to use this 1707f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * interface without harming your application's maintainability. 1717f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * 1727f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * <h3>Recommended Alternatives</h3> 1737f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * <strong>JSON</strong> is concise, human-readable and efficient. Android 1747f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * includes both a {@link android.util.JsonReader streaming API} and a {@link 1757f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * org.json.JSONObject tree API} to read and write JSON. Use a binding library 1767f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * like <a href="http://code.google.com/p/google-gson/">GSON</a> to read and 1777f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * write Java objects directly. 1787f3ad1c1545d8a085396e691502937f433d371fePrzemyslaw Szczepaniak * 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author unascribed 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.ObjectOutputStream 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.ObjectInputStream 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.ObjectOutput 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.ObjectInput 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.io.Externalizable 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since JDK1.1 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic interface Serializable { 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 189