Adds emulation for some Java IO classes.

Adds emulation for the following Java IO classes based on
the Android libcore implementation:
  - java.io.Externalizable
  - java.io.DataInput
  - java.io.DataOutput
  - java.io.ObjectInput
  - java.io.ObjectOutput
  - java.io.Externalizable

Change-Id: I468e493a4f23ddaa8c77f328eef18a589af04522
diff --git a/user/super/com/google/gwt/emul/java/io/DataInput.java b/user/super/com/google/gwt/emul/java/io/DataInput.java
new file mode 100644
index 0000000..5250b77
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/io/DataInput.java
@@ -0,0 +1,243 @@
+// CHECKSTYLE_OFF: Copyrighted to the Android Open Source Project.
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+// CHECKSTYLE_ON
+
+package java.io;
+
+/**
+ * Defines an interface for classes that are able to read big-endian typed data from some
+ * source. Typically, this data has been written by a class which implements
+ * {@link DataOutput}. Types that can be read include byte, 16-bit short, 32-bit
+ * int, 32-bit float, 64-bit long, 64-bit double, byte strings, and MUTF-8
+ * strings.
+ *
+ * <h3>MUTF-8 (Modified UTF-8) Encoding</h3>
+ * <p>
+ * When encoding strings as UTF, implementations of {@code DataInput} and
+ * {@code DataOutput} use a slightly modified form of UTF-8, hereafter referred
+ * to as MUTF-8. This form is identical to standard UTF-8, except:
+ * <ul>
+ * <li>Only the one-, two-, and three-byte encodings are used.</li>
+ * <li>Code points in the range <code>U+10000</code> &hellip;
+ * <code>U+10ffff</code> are encoded as a surrogate pair, each of which is
+ * represented as a three-byte encoded value.</li>
+ * <li>The code point <code>U+0000</code> is encoded in two-byte form.</li>
+ * </ul>
+ * <p>
+ * Please refer to <a href="http://unicode.org">The Unicode Standard</a> for
+ * further information about character encoding. MUTF-8 is actually closer to
+ * the (relatively less well-known) encoding <a
+ * href="http://www.unicode.org/reports/tr26/">CESU-8</a> than to UTF-8 per se.
+ *
+ * @see DataInputStream
+ * @see RandomAccessFile
+ */
+public interface DataInput {
+  /**
+   * Reads a boolean.
+   *
+   * @return the next boolean value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeBoolean(boolean)
+   */
+   boolean readBoolean() throws IOException;
+
+  /**
+   * Reads an 8-bit byte value.
+   *
+   * @return the next byte value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeByte(int)
+   */
+  byte readByte() throws IOException;
+
+  /**
+   * Reads a big-endian 16-bit character value.
+   *
+   * @return the next char value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeChar(int)
+   */
+  char readChar() throws IOException;
+
+  /**
+   * Reads a big-endian 64-bit double value.
+   *
+   * @return the next double value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeDouble(double)
+   */
+  double readDouble() throws IOException;
+
+  /**
+   * Reads a big-endian 32-bit float value.
+   *
+   * @return the next float value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeFloat(float)
+   */
+  float readFloat() throws IOException;
+
+  /**
+   * Equivalent to {@code readFully(dst, 0, dst.length);}.
+   */
+  void readFully(byte[] dst) throws IOException;
+
+  /**
+   * Reads {@code byteCount} bytes from this stream and stores them in the byte
+   * array {@code dst} starting at {@code offset}. If {@code byteCount} is zero, then this
+   * method returns without reading any bytes. Otherwise, this method blocks until
+   * {@code byteCount} bytes have been read. If insufficient bytes are available,
+   * {@code EOFException} is thrown. If an I/O error occurs, {@code IOException} is
+   * thrown. When an exception is thrown, some bytes may have been consumed from the stream
+   * and written into the array.
+   *
+   * @param dst
+   *            the byte array into which the data is read.
+   * @param offset
+   *            the offset in {@code dst} at which to store the bytes.
+   * @param byteCount
+   *            the number of bytes to read.
+   * @throws EOFException
+   *             if the end of the source stream is reached before enough
+   *             bytes have been read.
+   * @throws IndexOutOfBoundsException
+   *             if {@code offset < 0} or {@code byteCount < 0}, or
+   *             {@code offset + byteCount > dst.length}.
+   * @throws IOException
+   *             if a problem occurs while reading from this stream.
+   * @throws NullPointerException
+   *             if {@code dst} is null.
+   */
+  void readFully(byte[] dst, int offset, int byteCount) throws IOException;
+
+  /**
+   * Reads a big-endian 32-bit integer value.
+   *
+   * @return the next int value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeInt(int)
+   */
+  int readInt() throws IOException;
+
+  /**
+   * Returns a string containing the next line of text available from this
+   * stream. A line is made of zero or more characters followed by {@code
+   * '\n'}, {@code '\r'}, {@code "\r\n"} or the end of the stream. The string
+   * does not include the newline sequence.
+   *
+   * @return the contents of the line or null if no characters have been read
+   *         before the end of the stream.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   */
+  String readLine() throws IOException;
+
+  /**
+   * Reads a big-endian 64-bit long value.
+   *
+   * @return the next long value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeLong(long)
+   */
+  long readLong() throws IOException;
+
+  /**
+   * Reads a big-endian 16-bit short value.
+   *
+   * @return the next short value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeShort(int)
+   */
+  short readShort() throws IOException;
+
+  /**
+   * Reads an unsigned 8-bit byte value and returns it as an int.
+   *
+   * @return the next unsigned byte value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeByte(int)
+   */
+  int readUnsignedByte() throws IOException;
+
+  /**
+   * Reads a big-endian 16-bit unsigned short value and returns it as an int.
+   *
+   * @return the next unsigned short value.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeShort(int)
+   */
+  int readUnsignedShort() throws IOException;
+
+  /**
+   * Reads a string encoded with {@link DataInput modified UTF-8}.
+   *
+   * @return the next string encoded with {@link DataInput modified UTF-8}.
+   * @throws EOFException if the end of the input is reached before the read
+   *         request can be satisfied.
+   * @throws IOException
+   *             if an I/O error occurs while reading.
+   * @see DataOutput#writeUTF(java.lang.String)
+   */
+  String readUTF() throws IOException;
+
+  /**
+   * Skips {@code count} number of bytes. This method will not throw an
+   * {@link EOFException} if the end of the input is reached before
+   * {@code count} bytes where skipped.
+   *
+   * @param count
+   *            the number of bytes to skip.
+   * @return the number of bytes actually skipped.
+   * @throws IOException
+   *             if a problem occurs during skipping.
+   */
+  int skipBytes(int count) throws IOException;
+}
\ No newline at end of file
diff --git a/user/super/com/google/gwt/emul/java/io/DataOutput.java b/user/super/com/google/gwt/emul/java/io/DataOutput.java
new file mode 100644
index 0000000..0c000f5
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/io/DataOutput.java
@@ -0,0 +1,166 @@
+// CHECKSTYLE_OFF: Copyrighted to the Android Open Source Project.
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+// CHECKSTYLE_ON
+
+package java.io;
+
+/**
+ * Defines an interface for classes that are able to write big-endian typed data to some
+ * target. Typically, this data can be read in by a class which implements
+ * DataInput. Types that can be written include byte, 16-bit short, 32-bit int,
+ * 32-bit float, 64-bit long, 64-bit double, byte strings, and {@link DataInput
+ * MUTF-8} encoded strings.
+ *
+ * @see DataOutputStream
+ * @see RandomAccessFile
+ */
+public interface DataOutput {
+
+  /**
+   * Writes the entire contents of the byte array {@code buffer} to this
+   * stream.
+   *
+   * @param buffer the buffer to write.
+   * @throws IOException if an I/O error occurs while writing.
+   */
+  void write(byte[] buffer) throws IOException;
+
+  /**
+   * Writes {@code count} bytes from the byte array {@code buffer} starting at
+   * offset {@code index}.
+   *
+   * @param buffer the buffer to write.
+   * @param offset the index of the first byte in {@code buffer} to write.
+   * @param count the number of bytes from the {@code buffer} to write.
+   * @throws IOException if an I/O error occurs while writing.
+   */
+  void write(byte[] buffer, int offset, int count) throws IOException;
+
+  /**
+   * Writes the specified 8-bit byte.
+   *
+   * @param oneByte the byte to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readByte()
+   */
+  void write(int oneByte) throws IOException;
+
+  /**
+   * Writes the specified boolean.
+   *
+   * @param val the boolean value to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readBoolean()
+   */
+  void writeBoolean(boolean val) throws IOException;
+
+  /**
+   * Writes the specified 8-bit byte.
+   *
+   * @param val the byte value to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readByte()
+   * @see DataInput#readUnsignedByte()
+   */
+  void writeByte(int val) throws IOException;
+
+  /**
+   * Writes the low order 8-bit bytes from the specified string.
+   *
+   * @param str the string containing the bytes to write.
+   * @throws IOException if an I/O error occurs while writing.
+   */
+  void writeBytes(String str) throws IOException;
+
+  /**
+   * Writes the specified 16-bit character in big-endian order. Only the two least significant
+   * bytes of the integer {@code oneByte} are written.
+   *
+   * @param val the character to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readChar()
+   */
+  void writeChar(int val) throws IOException;
+
+  /**
+   * Writes the 16-bit characters contained in {@code str} in big-endian order.
+   *
+   * @param str the string that contains the characters to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readChar()
+   */
+  void writeChars(String str) throws IOException;
+
+  /**
+   * Writes the specified 64-bit double in big-endian order. The resulting output is the eight
+   * bytes returned by {@link Double#doubleToLongBits(double)}.
+   *
+   * @param val the double to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readDouble()
+   */
+  void writeDouble(double val) throws IOException;
+
+  /**
+   * Writes the specified 32-bit float in big-endian order. The resulting output is the four bytes
+   * returned by {@link Float#floatToIntBits(float)}.
+   *
+   * @param val the float to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readFloat()
+   */
+  void writeFloat(float val) throws IOException;
+
+  /**
+   * Writes the specified 32-bit int in big-endian order.
+   *
+   * @param val the int to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readInt()
+   */
+  void writeInt(int val) throws IOException;
+
+  /**
+   * Writes the specified 64-bit long in big-endian order.
+   *
+   * @param val the long to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readLong()
+   */
+  void writeLong(long val) throws IOException;
+
+  /**
+   * Writes the specified 16-bit short in big-endian order. Only the lower two bytes of {@code
+   * val} are written.
+   *
+   * @param val the short to write.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readShort()
+   * @see DataInput#readUnsignedShort()
+   */
+  void writeShort(int val) throws IOException;
+
+  /**
+   * Writes the specified string encoded in {@link DataInput modified UTF-8}.
+   *
+   * @param str the string to write encoded in {@link DataInput modified UTF-8}.
+   * @throws IOException if an I/O error occurs while writing.
+   * @see DataInput#readUTF()
+   */
+  void writeUTF(String str) throws IOException;
+}
\ No newline at end of file
diff --git a/user/super/com/google/gwt/emul/java/io/Externalizable.java b/user/super/com/google/gwt/emul/java/io/Externalizable.java
new file mode 100644
index 0000000..4d1c17a
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/io/Externalizable.java
@@ -0,0 +1,49 @@
+// CHECKSTYLE_OFF: Copyrighted to the Android Open Source Project.
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+// CHECKSTYLE_ON
+
+package java.io;
+
+/**
+ * Defines an interface for classes that want to be serializable, but have their
+ * own binary representation.
+ */
+public interface Externalizable extends Serializable {
+  /**
+   * Reads the next object from the ObjectInput <code>input</code>.
+   *
+   * @param input
+   *            the ObjectInput from which the next object is read.
+   * @throws IOException
+   *             if an error occurs attempting to read from {@code input}.
+   * @throws ClassNotFoundException
+   *             if the class of the instance being loaded cannot be found.
+   */
+  void readExternal(ObjectInput input) throws IOException,
+      ClassNotFoundException;
+
+  /**
+   * Writes the receiver to the ObjectOutput <code>output</code>.
+   *
+   * @param output
+   *            the ObjectOutput to write the object to.
+   * @throws IOException
+   *             if an error occurs attempting to write to {@code output}.
+   */
+  void writeExternal(ObjectOutput output) throws IOException;
+}
\ No newline at end of file
diff --git a/user/super/com/google/gwt/emul/java/io/ObjectInput.java b/user/super/com/google/gwt/emul/java/io/ObjectInput.java
new file mode 100644
index 0000000..b2dfeb8
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/io/ObjectInput.java
@@ -0,0 +1,113 @@
+// CHECKSTYLE_OFF: Copyrighted to the Android Open Source Project.
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+// CHECKSTYLE_ON
+
+package java.io;
+
+/**
+ * Defines an interface for classes that allow reading serialized objects.
+ *
+ * @see ObjectInputStream
+ * @see ObjectOutput
+ */
+public interface ObjectInput extends DataInput, AutoCloseable {
+  /**
+   * Indicates the number of bytes of primitive data that can be read without
+   * blocking.
+   *
+   * @return the number of bytes available.
+   * @throws IOException
+   *             if an I/O error occurs.
+   */
+  int available() throws IOException;
+
+  /**
+   * Closes this stream. Implementations of this method should free any
+   * resources used by the stream.
+   *
+   * @throws IOException
+   *             if an I/O error occurs while closing the input stream.
+   */
+  void close() throws IOException;
+
+  /**
+   * Reads a single byte from this stream and returns it as an integer in the
+   * range from 0 to 255. Returns -1 if the end of this stream has been
+   * reached. Blocks if no input is available.
+   *
+   * @return the byte read or -1 if the end of this stream has been reached.
+   * @throws IOException
+   *             if this stream is closed or another I/O error occurs.
+   */
+  int read() throws IOException;
+
+  /**
+   * Reads bytes from this stream into the byte array {@code buffer}. Blocks
+   * while waiting for input.
+   *
+   * @param buffer
+   *            the array in which to store the bytes read.
+   * @return the number of bytes read or -1 if the end of this stream has been
+   *         reached.
+   * @throws IOException
+   *             if this stream is closed or another I/O error occurs.
+   */
+  int read(byte[] buffer) throws IOException;
+
+  /**
+   * Reads at most {@code count} bytes from this stream and stores them in
+   * byte array {@code buffer} starting at offset {@code count}. Blocks while
+   * waiting for input.
+   *
+   * @param buffer
+   *            the array in which to store the bytes read.
+   * @param offset
+   *            the initial position in {@code buffer} to store the bytes read
+   *            from this stream.
+   * @param count
+   *            the maximum number of bytes to store in {@code buffer}.
+   * @return the number of bytes read or -1 if the end of this stream has been
+   *         reached.
+   * @throws IOException
+   *             if this stream is closed or another I/O error occurs.
+   */
+  int read(byte[] buffer, int offset, int count) throws IOException;
+
+  /**
+   * Reads the next object from this stream.
+   *
+   * @return the object read.
+   *
+   * @throws ClassNotFoundException
+   *             if the object's class cannot be found.
+   * @throws IOException
+   *             if this stream is closed or another I/O error occurs.
+   */
+  Object readObject() throws ClassNotFoundException, IOException;
+
+  /**
+   * Skips {@code byteCount} bytes on this stream. Less than {@code byteCount} byte are
+   * skipped if the end of this stream is reached before the operation
+   * completes.
+   *
+   * @return the number of bytes actually skipped.
+   * @throws IOException
+   *             if this stream is closed or another I/O error occurs.
+   */
+  long skip(long byteCount) throws IOException;
+}
\ No newline at end of file
diff --git a/user/super/com/google/gwt/emul/java/io/ObjectOutput.java b/user/super/com/google/gwt/emul/java/io/ObjectOutput.java
new file mode 100644
index 0000000..4eae0cf
--- /dev/null
+++ b/user/super/com/google/gwt/emul/java/io/ObjectOutput.java
@@ -0,0 +1,96 @@
+// CHECKSTYLE_OFF: Copyrighted to the Android Open Source Project.
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+// CHECKSTYLE_ON
+
+package java.io;
+
+/**
+ * Defines an interface for classes that allow reading serialized objects.
+ *
+ * @see ObjectOutputStream
+ * @see ObjectInput
+ */
+public interface ObjectOutput extends DataOutput, AutoCloseable {
+  /**
+   * Closes the target stream. Implementations of this method should free any
+   * resources used by the stream.
+   *
+   * @throws IOException
+   *             if an error occurs while closing the target stream.
+   */
+  void close() throws IOException;
+
+  /**
+   * Flushes the target stream. Implementations of this method should ensure
+   * that any pending writes are written out to the target stream.
+   *
+   * @throws IOException
+   *             if an error occurs while flushing the target stream.
+   */
+  void flush() throws IOException;
+
+  /**
+   * Writes the entire contents of the byte array {@code buffer} to the output
+   * stream. Blocks until all bytes are written.
+   *
+   * @param buffer
+   *            the buffer to write.
+   * @throws IOException
+   *             if an error occurs while writing to the target stream.
+   */
+  void write(byte[] buffer) throws IOException;
+
+  /**
+   * Writes {@code count} bytes from the byte array {@code buffer} starting at
+   * position {@code offset} to the target stream. Blocks until all bytes are
+   * written.
+   *
+   * @param buffer
+   *            the buffer to write.
+   * @param offset
+   *            the index of the first byte in {@code buffer} to write.
+   * @param count
+   *            the number of bytes from {@code buffer} to write to the target
+   *            stream.
+   * @throws IOException
+   *             if an error occurs while writing to the target stream.
+   */
+  void write(byte[] buffer, int offset, int count) throws IOException;
+
+  /**
+   * Writes a single byte to the target stream. Only the least significant
+   * byte of the integer {@code value} is written to the stream. Blocks until
+   * the byte is actually written.
+   *
+   * @param value
+   *            the byte to write.
+   * @throws IOException
+   *             if an error occurs while writing to the target stream.
+   */
+  void write(int value) throws IOException;
+
+  /**
+   * Writes the specified object {@code obj} to the target stream.
+   *
+   * @param obj
+   *            the object to write.
+   * @throws IOException
+   *             if an error occurs while writing to the target stream.
+   */
+  void writeObject(Object obj) throws IOException;
+}
\ No newline at end of file