Puede utilizar los plug-ins DataSerializer para omitir el inflado automático de objetos y recuperar manualmente los atributos de los datos que ya se han serializado. También puede utilizar el DataSerializer para insertar y actualizar datos en su formato serializado. Este uso puede ser útil cuando sólo es necesario acceder a una parte de los datos o cuando deben pasarse datos entre sistemas.
Esta tarea utiliza la modalidad de copia COPY_TO_BYTES_RAW con los plug-ins MapSerializerPlugin y ValueSerializerPlugin. El MapSerializer es el punto de plug-in principal a la interfaz BackingMap. Incluye dos plug-ins anidados, KeyDataSerializer y ValueDataSerializer. Dado que el producto no da soporte a plug-ins anidados, el BaseMapSerializer da soporte de forma artificial a plug-ins anidados o conectados. Por lo tanto, cuando se utilizan estas API en el contenedor OSGi, el MapSerializer es el único proxy. Ninguno de los plug-ins anidados debe estar almacenado en memoria caché en otros plug-ins dependientes como, por ejemplo, un cargador, a menos que esté también a la escucha de sucesos de ciclo de vida de BackingMap, de manera que pueda renovar sus referencias de soporte.
Cuando se establece COPY_TO_BYTES_RAW, todos los métodos ObjectMap devuelven objetos SerializedValue, lo que permite al usuario recuperar el formato serializado o el formato de objeto Java del valor.
Cuando se utiliza un plug-in KeySerializerPlugin, todos los métodos que devuelven claves, como los plug-ins MapIndexPlugin o Loader, devuelven objetos SerializedKey.
Cuando los datos ya están en formato serializado, se insertan utilizando los mismos objetos SerializedKey y SerializedValue. Cuando los datos están en formato byte[], se utilizan las fábricas DataObjectKeyFactory y DataObjectValueFactory para crear la clave o derivador de valor adecuados. Las fábricas están disponibles en el DataObjectContext, al que se puede acceder desde el SerializerAccessor para la BackingMap, o desde dentro de la implementación de DataSerializer.
El ejemplo de este tema muestra cómo completar las siguientes acciones:
import java.io.IOException;
import com.ibm.websphere.objectgrid.CopyMode;
import com.ibm.websphere.objectgrid.ObjectGrid;
import com.ibm.websphere.objectgrid.ObjectGridException;
import com.ibm.websphere.objectgrid.ObjectMap;
import com.ibm.websphere.objectgrid.Session;
import com.ibm.websphere.objectgrid.io.XsDataOutputStream;
import com.ibm.websphere.objectgrid.plugins.io.SerializerAccessor;
import com.ibm.websphere.objectgrid.plugins.io.ValueSerializerPlugin;
import com.ibm.websphere.objectgrid.plugins.io.dataobject.DataObjectContext;
import com.ibm.websphere.objectgrid.plugins.io.dataobject.SerializedKey;
import com.ibm.websphere.objectgrid.plugins.io.dataobject.SerializedValue;
/**
* Utilice el DataSerializer para serializar una clave Order.
*/
public byte[] serializeOrderKey(ObjectGrid grid, String key)
throws IOException {
SerializerAccessor sa = grid.getMap("Order").getSerializerAccessor();
DataObjectContext dftObjCtx = sa.getDefaultContext();
XsDataOutputStream out = dftObjCtx.getDataStreamManager()
.createOutputStream();
sa.getMapSerializerPlugin().getKeySerializerPlugin()
.serializeDataObject(sa.getDefaultContext(), key, out);
return out.toByteArray();
}
/**
* Utilice el DataSerializer para serializar un valor Order.
*/
public byte[] serializeOrderValue(ObjectGrid grid, Order value)
throws IOException {
SerializerAccessor sa = grid.getMap("Order").getSerializerAccessor();
DataObjectContext dftObjCtx = sa.getDefaultContext();
XsDataOutputStream out = dftObjCtx.getDataStreamManager()
.createOutputStream();
sa.getMapSerializerPlugin().getValueSerializerPlugin()
.serializeDataObject(sa.getDefaultContext(), value, out);
return out.toByteArray();
}
/**
* Recupere un único Order en formato serializado.
*/
public byte[] fetchOrderRAWBytes(Session session, String key)
throws ObjectGridException {
ObjectMap map = session.getMap("Order");
// Sustituya la CopyMode para recuperar el formato serializado a partir del valor.
// Este proceso afecta a todos los métodos de la API a partir de este punto durante
// todo lo que dura la sesión.
map.setCopyMode(CopyMode.COPY_TO_BYTES_RAW, null);
SerializedValue serValue = (SerializedValue) map.get(key);
if (serValue == null)
return null;
// Recupere la matriz de bytes y devuélvala al llamador.
return serValue.getInputStream().toByteArray();
}
/**
* Recupere uno o más atributos de Order sin inflar el
* objeto Order.
*/
public Object[] fetchOrderAttribute(Session session, String key,
String... attributes) throws ObjectGridException, IOException {
ObjectMap map = session.getMap("Order");
// Sustituya la CopyMode para recuperar el formato serializado a partir del valor.
// Este proceso afecta a todos los métodos de la API a partir de este punto durante
// todo lo que dura la sesión.
map.setCopyMode(CopyMode.COPY_TO_BYTES_RAW, null);
SerializedValue serValue = (SerializedValue) map.get(key);
if (serValue == null)
return null;
// Recuperar un único atributo del almacenamiento intermedio de bytes.
ValueSerializerPlugin valSer = session.getObjectGrid()
.getMap(map.getName()).getSerializerAccessor()
.getMapSerializerPlugin().getValueSerializerPlugin();
Object attrCtx = valSer.getAttributeContexts(attributes);
return valSer.inflateDataObjectAttributes(serValue.getContext(),
serValue.getInputStream(), attrCtx);
}
/**
* Inserta una clave serializada previamente en la correlación Order.
*/
public void insertRAWOrder(Session session, byte[] key, byte[] value)
throws ObjectGridException {
ObjectMap map = session.getMap("Order");
// Obtener una referencia al DataObjectContext predeterminado para la correlación.
DataObjectContext dftDtaObjCtx = session.getObjectGrid()
.getMap(map.getName()).getSerializerAccessor()
.getDefaultContext();
// Ajusta la clave y el valor en un derivador SerializedKey y
// SerializedValue.
SerializedKey serKey = dftDtaObjCtx.getKeyFactory().createKey(key);
SerializedValue serValue = dftDtaObjCtx.getValueFactory().createValue(
value);
// Inserte el formato serializado de la clave y el valor.
map.insert(serKey, serValue);
}
}