Objektdeserialisierung beim Aktualisieren und Abrufen von Cachedaten vermeiden

Sie können die DataSerializer-Plug-ins verwenden, um die automatische Objektdeserialisierung zu umgehen und Attribute manuell aus Daten abzurufen, die bereits serialisiert wurden. Sie können das DataSerializer-Plug-in auch verwenden, um Daten in serialisierter Form einzufügen und zu aktualisieren. Diese Nutzung kann hilfreich sein, wenn nur auf einen Teil der Daten zugegriffen werden muss oder wenn die Daten zwischen Systemen übergeben werden müssen.

Informationen zu diesem Vorgang

In dieser Aufgabe wird der Kopiermodus COPY_TO_BYTES_RAW für die Plug-ins "MapSerializerPlugin" und "ValueSerializerPlugin" verwendet. Das Plug-in "MapSerializer" ist der Haupt-Plug-in-Punkt für die Schnittstelle "BackingMap". Es enthält zwei verschachtelte Plug-ins: KeyDataSerializer und ValueDataSerializer. Da das Produkt keine verschachtelten Plug-ins unterstützt, unterstützt BaseMapSerializer verschachtelte und verbundene Plug-ins künstlich. Wenn Sie diese APIs im OSGi-Container verwenden ist MapSerializer deshalb der einzige Proxy. Verschachtelte Plug-ins dürfen nicht in anderen abhängigen Plug-ins wie Ladeprogrammen zwischengespeichert werden, sofern sie nicht auch für BackingMap-Lebenszyklusereignisse empfangsbereit sind, so dass die unterstützenden Referenzen aktualisiert werden können.

Wenn COPY_TO_BYTES_RAW gesetzt ist, geben alle ObjectMap-Methoden SerializedValue-Objekte zurück, was dem Benutzer ermöglicht, die serialisierte Form oder die Java-Objektform des Werts abzurufen.

Wenn Sie ein KeySerializerPlugin-Plug-in verwenden, geben alle Methoden, die Schlüssel zurückgeben, wie z. B. die MapIndexPlugin- und Loader-Plug-ins, SerializedKey-Objekte zurück.

Liegen die Daten bereits in serialisierter Form vor, werden die Daten mit denselben SerializedKey- und SerializedValue-Objekten eingefügt. Wenn die Daten im byte[]-Format vorliegen, werden die DataObjectKeyFactory- und DataObjectValueFactory-Factorys verwendet, um den entsprechenden Schlüssel oder Wertwrapper zu erstellen. Die Factorys sind im DataObjectContext verfügbar, auf den Sie über den SerializerAccessor für die BackingMap oder über die DataSerializer-Implementierung zugreifen können.

Das Beispiel in diesem Abschnitt veranschaulicht, wie die folgenden Aktionen ausgeführt werden:

Vorgehensweise

  1. DataSerializer-Plug-ins für die Serialisierung und Deserialisierung von Datenobjekten verwenden.
  2. Serialisierte Werte abrufen.
  3. Einzelne Attribute aus einem serialisierten Wert abrufen.
  4. Vorserialisierte Schlüssel und Werte einfügen.

Beispiel

Verwenden Sie dieses Beispiel, um Cachedaten zu aktualisieren und abzurufen:
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;

    /**
     * DataSerializer zum Serialisieren eines Order-Schlüssels verwenden.
     */
    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();
    }

    /**
     * DataSerializer zum Serialisieren eines Order-Werts verwenden.
     */
    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();
    }

    /**
     * Einzelne Order in serialisierter Form abrufen.
     */
    public byte[] fetchOrderRAWBytes(Session session, String key)
            		throws ObjectGridException {
        ObjectMap map = session.getMap("Order");

        // CopyMode überschreiben, um die serialisierte Form des Werts abzurufen.
        // Dieser Prozess wirkt sich von nun an für die gesamte Lebensdauer der
        // Sitzung auf alle API-Methoden aus.
        map.setCopyMode(CopyMode.COPY_TO_BYTES_RAW, null);
        SerializedValue serValue = (SerializedValue) map.get(key);

        if (serValue == null)
                  return null;

        // Byte-Array abrufen und an deen Aufrufenden zurückgeben.
        return serValue.getInputStream().toByteArray();
    }

    /**
     * Attribute aus der Order abrufen, ohne das Order-Objekt zu
     * deserialisieren.
     */
    public Object[] fetchOrderAttribute(Session session, String key,
            String... attributes) throws ObjectGridException, IOException {
        ObjectMap map = session.getMap("Order");

        // CopyMode überschreiben, um die serialisierte Form des Werts abzurufen.
        // Dieser Prozess wirkt sich von nun an für die gesamte Lebensdauer der
        // Sitzung auf alle API-Methoden aus.
        map.setCopyMode(CopyMode.COPY_TO_BYTES_RAW, null);
        SerializedValue serValue = (SerializedValue) map.get(key);

        if (serValue == null)
                  return null;

        // Einzelnes Attribut aus dem Bytepuffer abrufen
        ValueSerializerPlugin valSer = session.getObjectGrid()
                .getMap(map.getName()).getSerializerAccessor()
                .getMapSerializerPlugin().getValueSerializerPlugin();
        Object attrCtx = valSer.getAttributeContexts(attributes);
        return valSer.inflateDataObjectAttributes(serValue.getContext(),
                serValue.getInputStream(), attrCtx);
    }

    /**
     * Vorserialisierten Schlüssel und Wert in die Order-Map einfügen.
     */
    public void insertRAWOrder(Session session, byte[] key, byte[] value)
            		throws ObjectGridException {
        ObjectMap map = session.getMap("Order");

        // Referenz auf den Standard-DataObjectContext für die Map abrufen.
        DataObjectContext dftDtaObjCtx = session.getObjectGrid()
                .getMap(map.getName()).getSerializerAccessor()
                .getDefaultContext();

        // Schlüssel und Wert in einen SerializedKey- und SerializedValue-Wrapper
        // einschließen.
        SerializedKey serKey = dftDtaObjCtx.getKeyFactory().createKey(key);
        SerializedValue serValue = dftDtaObjCtx.getValueFactory().createValue(
                value);

        // Serialisiert Form des Schlüssels und des Werts einfügen.
        map.insert(serKey, serValue);
    }
}