blob: 779d459e135eaec37c7ef35ff39acca5f1513575 [file] [log] [blame]
/*
* 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.
*/
package org.apache.geode;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.Serializable;
/**
* An interface for objects whose state can be written/read as primitive types and strings ("data").
* That is, instead of serializing itself to an {@link java.io.ObjectOutputStream}, a
* <code>DataSerializable</code> can serialize itself to a {@link DataOutput}. By implementing this
* interface, objects can be serialized faster and in a more compact format than standard Java
* serialization. The {@link DataSerializer} class contains a number of static methods that may be
* helpful to implementations of <code>DataSerializable</code>.
*
* <P>
*
* When possible, GemFire respects the <code>DataSerializable</code> contract to provide optimal
* object serialization. For instance, if a <code>DataSerializable</code> object is
* {@linkplain org.apache.geode.cache.Region#put(Object, Object) placed} into a distributed cache
* region, its <code>toData</code> method will be used to serialize it when it is sent to another
* member of the distributed system.
*
* <P>
*
* To avoid the overhead of Java reflection, <code>DataSerializable</code> classes may register an
* {@link Instantiator} to be used during deserialization. Alternatively, classes that implement
* <code>DataSerializable</code> can provide a zero-argument constructor that will be invoked when
* they are read with {@link DataSerializer#readObject}.
*
* <P>
*
* Some classes (especially third-party classes that you may not have the source code to) cannot be
* modified to implement <code>DataSerializable</code>. These classes can be data serialized by an
* instance of {@link DataSerializer}.
*
* <P>
*
* <code>DataSerializable</code> offers improved performance over standard Java serialization, but
* does not offer all of the features of standard Java serialization. In particular, data
* serialization does not attempt to maintain referential integrity among the objects it is writing
* or reading. As a result, data serialization should not be used with complex object graphs.
* Attempting to data serialize graphs that contain object cycles will result in infinite recursion
* and a {@link StackOverflowError}. Attempting to deserialize an object graph that contains
* multiple reference paths to the same object will result in multiple copies of the objects that
* are referred to through multiple paths.
*
* <P>
*
* <CENTER>
* <IMG src="{@docRoot}/javadoc-images/data-serialization-exceptions.gif" HEIGHT="219" WIDTH="698">
* </CENTER>
*
* @see java.io.Serializable
* @see DataSerializer
* @see Instantiator
*
* @since GemFire 3.5
*/
public interface DataSerializable extends Serializable {
/**
* Writes the state of this object as primitive data to the given <code>DataOutput</code>.
* <p>
* Since 5.7 it is possible for any method call to the specified <code>DataOutput</code> to throw
* {@link GemFireRethrowable}. It should <em>not</em> be caught by user code. If it is it
* <em>must</em> be rethrown.
*
* @throws IOException A problem occurs while writing to <code>out</code>
*/
void toData(DataOutput out) throws IOException;
/**
* Reads the state of this object as primitive data from the given <code>DataInput</code>.
*
* @throws IOException A problem occurs while reading from <code>in</code>
* @throws ClassNotFoundException A class could not be loaded while reading from <code>in</code>
*/
void fromData(DataInput in) throws IOException, ClassNotFoundException;
//////////////////////// Inner Classes ////////////////////////
/**
* <code>Replaceable</code> allows an object to write an alternative version of itself to a
* <code>DataOutput</code>. It is similar to the <code>writeReplace</code> method of standard Java
* {@linkplain java.io.Serializable serialization}.
*
* <P>
*
* Note that if a <code>Replaceable</code> is also <code>DataSerializable</code>, its
* <code>toData</code> method will <B>not</B> be invoked. Instead, its replacement object will be
* written to the stream using {@link DataSerializer#writeObject(Object, DataOutput)}.
*
* @see DataSerializer#writeObject(Object, DataOutput)
*/
interface Replaceable {
/**
* Replaces this object with another in the "output stream" written by
* {@link DataSerializer#writeObject(Object, DataOutput)}.
*/
Object replace() throws IOException;
}
}