Cómo evitar el inflado de objetos al actualizar y recuperar datos de memoria caché

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.

Acerca de esta tarea

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:

Procedimiento

  1. Utilice los plug-ins DataSerializer para serializar e inflar objetos de datos.
  2. Recupere los valores serializados.
  3. Recupere atributos individuales a partir de un valor serializado.
  4. Inserte claves y valores serializados previamente.

Ejemplo

Utilice este ejemplo para actualizar y recuperar datos de memoria caché:
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);
    }
}