blob: 64b37e7538afc69975c99d559f4654316eea6e6e [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.gemstone.gemfire.pdx;
import java.util.Date;
import com.gemstone.gemfire.cache.CacheFactory;
/**
* A PdxWriter will be passed to {@link PdxSerializable#toData(PdxWriter) toData} or
* {@link PdxSerializer#toData(Object, PdxWriter) PdxSerializer toData} by GemFire when it is serializing the
* domain class. The domain class needs to serialize instance
* fields using this interface. This interface is implemented
* by GemFire.
* <p>The order in which the fields are written must match the order in which they are
* read by {@link PdxReader}.
* <p>Field names are case sensitive.
* <p>All methods on this interface return itself to allow method calls to be
* chained together.
*
* @author darrel
* @since 6.6
*/
public interface PdxWriter {
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>char</code>.
* <p>Java char is mapped to .NET System.Char.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeChar(String fieldName, char value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>boolean</code>.
* <p>Java boolean is mapped to .NET System.Boolean.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeBoolean(String fieldName, boolean value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>byte</code>.
* <p>Java byte is mapped to .NET System.SByte.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeByte(String fieldName, byte value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>short</code>.
* <p>Java short is mapped to .NET System.Int16.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeShort(String fieldName, short value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int</code>.
* <p>Java int is mapped to .NET System.Int32.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeInt(String fieldName, int value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>long</code>.
* <p>Java long is mapped to .NET System.Int64.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeLong(String fieldName, long value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>float</code>.
* <p>Java float is mapped to .NET System.Float.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeFloat(String fieldName, float value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>double</code>.
* <p>Java double is mapped to .NET System.Double.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeDouble(String fieldName, double value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>Date</code>.
* <p>Java Date is mapped to .NET System.DateTime.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeDate(String fieldName, Date value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>String</code>.
* <p>Java String is mapped to .NET System.String.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeString(String fieldName, String value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>Object</code>.
* <p>
* It is best to use one of the other writeXXX methods if your field type
* will always be XXX. This method allows the field value to be anything
* that is an instance of Object. This gives you more flexibility but more
* space is used to store the serialized field.
* <p>
* Note that some Java objects serialized with this method may not be compatible with non-java languages.
* To ensure that only portable objects are serialized use {@link #writeObject(String, Object, boolean)}.
*
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeObject(String fieldName, Object value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>Object</code>.
* <p>
* It is best to use one of the other writeXXX methods if your field type
* will always be XXX. This method allows the field value to be anything
* that is an instance of Object. This gives you more flexibility but more
* space is used to store the serialized field.
* <p>
* Note that some Java objects serialized with this method may not be compatible with non-java languages.
* To ensure that only portable objects are serialized set the <code>checkPortability</code> parameter to true.
* The following is a list of the Java classes that are portable and the .NET class they are mapped to:
* <ul>
* <li>instances of {@link PdxSerializable}: .NET class of same name
* <li>instances of {@link PdxInstance}: .NET class of same name
* <li>instances serialized by a {@link PdxSerializer}: .NET class of same name
* <li>java.lang.Byte: System.SByte
* <li>java.lang.Boolean: System.Boolean
* <li>java.lang.Character: System.Char
* <li>java.lang.Short: System.Int16
* <li>java.lang.Integer: System.Int32
* <li>java.lang.Long: System.Int64
* <li>java.lang.Float: System.Float
* <li>java.lang.Double: System.Double
* <li>java.lang.String: System.String
* <li>java.util.Date: System.DateTime
* <li>byte[]: System.Byte[]
* <li>boolean[]: System.Boolean[]
* <li>char[]: System.Char[]
* <li>short[]: System.Int16[]
* <li>int[]: System.Int32[]
* <li>long[]: System.Int64[]
* <li>float[]: System.Float[]
* <li>double[]: System.Double[]
* <li>String[]: System.String[]
* <li>byte[][]: System.Byte[][]
* <li>Object[]: System.Collections.Generic.List<Object>
* <li>java.util.HashMap: System.Collections.Generics.IDictionary<Object, Object>
* <li>java.util.Hashtable: System.Collections.Hashtable
* <li>java.util.ArrayList: System.Collections.Generic.IList<Object>
* <li>java.util.Vector: System.Collections.ArrayList
* <li>java.util.HashSet: CacheableHashSet
* <li>java.util.LinkedHashSet: CacheableLinkedHashSet
* </ul>
*
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param checkPortability if true then an exception is thrown if a non-portable object is serialized
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws NonPortableClassException if checkPortability is true and a non-portable object is serialized
* @throws PdxSerializationException if serialization of the field fails.
* @since 6.6.2
*/
public PdxWriter writeObject(String fieldName, Object value, boolean checkPortability);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>boolean[]</code>.
* <p>Java boolean[] is mapped to .NET System.Boolean[].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeBooleanArray(String fieldName, boolean[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>char[]</code>.
* <p>Java char[] is mapped to .NET System.Char[].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeCharArray(String fieldName, char[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>byte[]</code>.
* <p>Java byte[] is mapped to .NET System.Byte[].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeByteArray(String fieldName, byte[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>short[]</code>.
* <p>Java short[] is mapped to .NET System.Int16[].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeShortArray(String fieldName, short[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int[]</code>.
* <p>Java int[] is mapped to .NET System.Int32[].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeIntArray(String fieldName, int[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>long[]</code>.
* <p>Java long[] is mapped to .NET System.Int64[].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeLongArray(String fieldName, long[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>float[]</code>.
* <p>Java float[] is mapped to .NET System.Float[].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeFloatArray(String fieldName, float[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>double[]</code>.
* <p>Java double[] is mapped to .NET System.Double[].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeDoubleArray(String fieldName, double[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>String[]</code>.
* <p>Java String[] is mapped to .NET System.String[].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeStringArray(String fieldName, String[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>Object[]</code>.
* <p>Java Object[] is mapped to .NET System.Collections.Generic.List<Object>.
* For how each element of the array is a mapped to .NET see {@link #writeObject(String, Object, boolean) writeObject}.
* Note that this call may serialize elements that are not compatible with non-java languages.
* To ensure that only portable objects are serialized use {@link #writeObjectArray(String, Object[], boolean)}.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeObjectArray(String fieldName, Object[] value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>Object[]</code>.
* <p>Java Object[] is mapped to .NET System.Collections.Generic.List<Object>.
* For how each element of the array is a mapped to .NET see {@link #writeObject(String, Object, boolean) writeObject}.
* Note that this call may serialize elements that are not compatible with non-java languages.
* To ensure that only portable objects are serialized use {@link #writeObjectArray(String, Object[], boolean)}.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param checkPortability if true then an exception is thrown if a non-portable object is serialized
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws NonPortableClassException if checkPortability is true and a non-portable element is serialized
* @throws PdxSerializationException if serialization of the field fails.
* @since 6.6.2
*/
public PdxWriter writeObjectArray(String fieldName, Object[] value, boolean checkPortability);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>byte[][]</code>.
* <p>Java byte[][] is mapped to .NET System.Byte[][].
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public PdxWriter writeArrayOfByteArrays(String fieldName, byte[][] value);
/**
* Writes the named field with the given value and type to the serialized form.
* This method uses the <code>fieldType</code> to determine which writeXXX method it should call.
* If it can not find a specific match to a writeXXX method it will call {@link #writeObject(String, Object) writeObject}.
* This method may serialize objects that are not portable to non-java languages.
* To ensure that only objects that are portable to non-java languages are serialized use {@link #writeField(String, Object, Class, boolean)} instead.
* <p>The fieldTypes that map to a specific method are:
* <ul>
* <li>boolean.class: {@link #writeBoolean}
* <li>byte.class: {@link #writeByte}
* <li>char.class: {@link #writeChar}
* <li>short.class: {@link #writeShort}
* <li>int.class: {@link #writeInt}
* <li>long.class: {@link #writeLong}
* <li>float.class: {@link #writeFloat}
* <li>double.class: {@link #writeDouble}
* <li>String.class: {@link #writeString}
* <li>Date.class: {@link #writeDate}
* <li>boolean[].class: {@link #writeBooleanArray}
* <li>byte[].class: {@link #writeByteArray}
* <li>char[].class: {@link #writeCharArray}
* <li>short[].class: {@link #writeShortArray}
* <li>int[].class: {@link #writeIntArray}
* <li>long[].class: {@link #writeLongArray}
* <li>float[].class: {@link #writeFloatArray}
* <li>double[].class: {@link #writeDoubleArray}
* <li>String[].class: {@link #writeStringArray}
* <li>byte[][].class: {@link #writeArrayOfByteArrays}
* <li>any other array class: {@link #writeObjectArray}
* </ul>
* Note that the object form of primitives, for example Integer.class and Long.class, map to {@link #writeObject(String, Object) writeObject}.
* @param fieldName the name of the field to write
* @param fieldValue the value of the field to write; this parameter's class must extend the <code>fieldType</code>
* @param fieldType the type of the field to write
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws PdxSerializationException if serialization of the field fails.
*/
public <CT, VT extends CT> PdxWriter writeField(String fieldName, VT fieldValue, Class<CT> fieldType);
/**
* Writes the named field with the given value and type to the serialized form.
* This method uses the <code>fieldType</code> to determine which writeXXX method it should call.
* If it can not find a specific match to a writeXXX method it will call {@link #writeObject(String, Object, boolean) writeObject}.
* To ensure that only objects that are portable to non-java languages are serialized set the <code>checkPortability</code> parameter to true.
* <p>The fieldTypes that map to a specific method are:
* <ul>
* <li>boolean.class: {@link #writeBoolean}
* <li>byte.class: {@link #writeByte}
* <li>char.class: {@link #writeChar}
* <li>short.class: {@link #writeShort}
* <li>int.class: {@link #writeInt}
* <li>long.class: {@link #writeLong}
* <li>float.class: {@link #writeFloat}
* <li>double.class: {@link #writeDouble}
* <li>String.class: {@link #writeString}
* <li>Date.class: {@link #writeDate}
* <li>boolean[].class: {@link #writeBooleanArray}
* <li>byte[].class: {@link #writeByteArray}
* <li>char[].class: {@link #writeCharArray}
* <li>short[].class: {@link #writeShortArray}
* <li>int[].class: {@link #writeIntArray}
* <li>long[].class: {@link #writeLongArray}
* <li>float[].class: {@link #writeFloatArray}
* <li>double[].class: {@link #writeDoubleArray}
* <li>String[].class: {@link #writeStringArray}
* <li>byte[][].class: {@link #writeArrayOfByteArrays}
* <li>any other array class: {@link #writeObjectArray(String, Object[], boolean)}
* </ul>
* Note that the object form of primitives, for example Integer.class and Long.class, map to {@link #writeObject(String, Object, boolean) writeObject}.
* @param fieldName the name of the field to write
* @param fieldValue the value of the field to write; this parameter's class must extend the <code>fieldType</code>
* @param fieldType the type of the field to write
* @param checkPortability if true then an exception is thrown if a non-portable object is serialized
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if the named field has already been written
* @throws NonPortableClassException if checkPortability is true and a non-portable object is serialized
* @throws PdxSerializationException if serialization of the field fails.
* @since 6.6.2
*/
public <CT, VT extends CT> PdxWriter writeField(String fieldName, VT fieldValue, Class<CT> fieldType, boolean checkPortability);
/**
* Writes the given unread fields to the serialized form.
* The unread fields are obtained by calling {@link PdxReader#readUnreadFields() readUnreadFields}.
* <p>This method must be called first before any of the writeXXX methods is called.
* @param unread the object that was returned from {@link PdxReader#readUnreadFields() readUnreadFields}.
* @return this PdxWriter
* @throws PdxFieldAlreadyExistsException if one of the writeXXX methods has already been called.
*/
public PdxWriter writeUnreadFields(PdxUnreadFields unread);
/**
* Indicate that the named field should be included in hashCode and equals checks
* of this object on a server that is accessing {@link PdxInstance}
* or when a client executes a query on a server.
*
* The fields that are marked as identity fields are used to generate the hashCode and
* equals methods of {@link PdxInstance}. Because of this, the identity fields should themselves
* either be primitives, or implement hashCode and equals.
*
* If no fields are set as identity fields, then all fields will be used in hashCode and equals
* checks.
*
* The identity fields should be marked after they are written using a write* method.
*
* @param fieldName the name of the field to mark as an identity field.
* @return this PdxWriter
* @throws PdxFieldDoesNotExistException if the named field has not already been written.
*/
public PdxWriter markIdentityField(String fieldName);
}