Eviter l'extension d'objet lors de la mise à jour et de l'extraction de données du cache

Vous pouvez utiliser le plug-in DataSerializer pour éviter l'extension d'objet automatique et extraire manuellement des attributs depuis des données déjà sérialisées. Vous pouvez également utiliser DataSerializer pour insérer et mettre à jour des données au format sérialisé. Cela peut être utile lorsqu'une seule partie des données doit être accessible ou lorsque les données doivent être transmises entre systèmes.

Pourquoi et quand exécuter cette tâche

Cette tâche utilise le mode de copie COPY_TO_BYTES_RAW avec les plug-in MapSerializerPlugin et ValueSerializerPlugin. MapSerializer est le point de plug-in vers l'interface BackingMap. Il contient deux plug-in imbriqués, KeyDataSerializer et ValueDataSerializer. Comme le produit ne prend pas en charge les plug-in imbriqués ou connectés, BaseMapSerializer prend en charge les plug-in imbriqués ou connectés artificiellement. Par conséquent, lorsque vous utilisez ces API dans le conteneur OSGi, MapSerializer est le seul proxy. Tous les plug-in imbriqués ne doivent pas être mis en cache dans d'autres plug-in dépendants, tels qu'un chargeur, sauf s'il est également à l'écoute des événements de cycle de vie de BackingMap, de sorte qu'il puisse régénérer ses références sous-jacentes.

Lorsque COPY_TO_BYTES_RAW est défini, toutes les méthodes ObjectMap renvoient des objets SerializedValue, ce qui permet à l'utilisateur d'extraire le format sérialisé ou l'objet Java de la valeur.

Lorsque vous utilisez un plug-in KeySerializerPlugin, toutes les méthodes qui renvoient des clés, telles que les plug-in MapIndexPlugin ou Loader, renvoient des objets SerializedKey.

Lorsque les données sont déjà au format sérialisé, elles sont insérées à l'aide des mêmes objets SerializedKey et SerializedValue. Lorsque les données sont au format byte[], les fabriques DataObjectKeyFactory et DataObjectValueFactory sont utilisées pour créer la clé appropriée ou l'encapsuleur de valeur. Les fabriques sont disponibles sur DataObjectContext, qui est accessible à partir de SerializerAccessor pour BackingMap, ou à partir de l'implémentation DataSerializer.

L'exemple contenu dans cette rubrique illustre comment effectuer les actions suivantes :

Procédure

  1. Utilisez les plug-in DataSerializer pour sérialiser et étendre les objet de données.
  2. Extrayez les valeurs sérialisées.
  3. Extrayez les attributs individuels à partir d'une valeur sérialisée.
  4. Insérez les valeurs et les clés pré-sérialisées.

Exemple

Utilisez cet exemple pour mettre à jour et extraire des données du cache :
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;

    /**
     * Use the DataSerializer to serialize an Order key.
     */
    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();
    }

    /**
     * Use the DataSerializer to serialize an Order value.
     */
    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();
    }

    /**
     * Retrieve a single Order in serialized form.
     */
    public byte[] fetchOrderRAWBytes(Session session, String key)
            throws ObjectGridException {
        ObjectMap map = session.getMap("Order");

        // Override the CopyMode to retrieve the serialized form of the value.
        // This process affects all API methods from this point on for the life
        // of the Session.
        map.setCopyMode(CopyMode.COPY_TO_BYTES_RAW, null);
        SerializedValue serValue = (SerializedValue) map.get(key);

        if (serValue == null)
            return null;

        // Retrieve the byte array and return it to the caller.
        return serValue.getInputStream().toByteArray();
    }

    /**
     * Retrieve one or more attributes from the Order without inflating the
     * Order object.
     */
    public Object[] fetchOrderAttribute(Session session, String key,
            String... attributes) throws ObjectGridException, IOException {
        ObjectMap map = session.getMap("Order");

        // Override the CopyMode to retrieve the serialized form of the value.
        // This process affects all API methods from this point on for the life
        // of the Session.
        map.setCopyMode(CopyMode.COPY_TO_BYTES_RAW, null);
        SerializedValue serValue = (SerializedValue) map.get(key);

        if (serValue == null)
            return null;

        // Retrieve a single attribute from the byte buffer.
        ValueSerializerPlugin valSer = session.getObjectGrid()
                .getMap(map.getName()).getSerializerAccessor()
                .getMapSerializerPlugin().getValueSerializerPlugin();
        Object attrCtx = valSer.getAttributeContexts(attributes);
        return valSer.inflateDataObjectAttributes(serValue.getContext(),
                serValue.getInputStream(), attrCtx);
    }

    /**
     * Inserts a pre-serialized key and value into the Order map.
     */
    public void insertRAWOrder(Session session, byte[] key, byte[] value)
            throws ObjectGridException {
        ObjectMap map = session.getMap("Order");

        // Get a referece to the default DataObjectContext for the map.
        DataObjectContext dftDtaObjCtx = session.getObjectGrid()
                .getMap(map.getName()).getSerializerAccessor()
                .getDefaultContext();

        // Wrap the key and value in a SerializedKey and SerializedValue
        // wrapper.
        SerializedKey serKey = dftDtaObjCtx.getKeyFactory().createKey(key);
        SerializedValue serValue = dftDtaObjCtx.getValueFactory().createValue(
                value);

        // Insert the serialized form of the key and value.
        map.insert(serKey, serValue);
    }
}