All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.openhft.chronicle.hash.serialization.MapMarshaller Maven / Gradle / Ivy

There is a newer version: 3.26ea4
Show newest version
/*
 * Copyright 2012-2018 Chronicle Map Contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.openhft.chronicle.hash.serialization;

import net.openhft.chronicle.bytes.Bytes;
import net.openhft.chronicle.wire.WireIn;
import net.openhft.chronicle.wire.WireOut;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;

import static net.openhft.chronicle.hash.serialization.StatefulCopyable.copyIfNeeded;

/**
 * Marshaller of {@code Map}. Uses {@link HashMap} (hence default key objects' equality and
 * {@code hashCode()} as the map implementation to deserialize into.
 * 

*

This marshaller supports multimap emulation on top of Chronicle Map, that is possible but * inefficient. See the * README section. *

*

Look for pre-defined key and value marshallers in {@link * net.openhft.chronicle.hash.serialization.impl} package. This package is not included into * Javadocs, but present in Chronicle Map distribution. If there are no existing marshallers for * your {@code Map} key or value types, define {@link BytesReader} and {@link BytesWriter} yourself. * * @param the key type of serialized Maps * @param the value type of serialized Maps * @see ListMarshaller * @see SetMarshaller */ public final class MapMarshaller implements BytesReader>, BytesWriter>, StatefulCopyable> { // Config fields private BytesReader keyReader; private BytesWriter keyWriter; private BytesReader valueReader; private BytesWriter valueWriter; // Cache fields private transient Deque orderedKeys; private transient Deque orderedValues; /** * Constructs a {@code MapMarshaller} with the given map keys' and values' serializers. * * @param keyReader map keys' reader * @param keyWriter map keys' writer * @param valueReader map values' reader * @param valueWriter map values' writer */ public MapMarshaller( BytesReader keyReader, BytesWriter keyWriter, BytesReader valueReader, BytesWriter valueWriter) { this.keyReader = keyReader; this.keyWriter = keyWriter; this.valueReader = valueReader; this.valueWriter = valueWriter; initTransients(); } private void initTransients() { orderedKeys = new ArrayDeque<>(); orderedValues = new ArrayDeque<>(); } @NotNull @Override public Map read(Bytes in, @Nullable Map using) { int size = in.readInt(); if (using == null) { using = new HashMap<>(((int) (size / 0.75))); for (int i = 0; i < size; i++) { using.put(keyReader.read(in, null), valueReader.read(in, null)); } } else { using.forEach((k, v) -> { orderedKeys.add(k); orderedValues.add(v); }); using.clear(); for (int i = 0; i < size; i++) { using.put(keyReader.read(in, orderedKeys.pollFirst()), valueReader.read(in, orderedValues.pollFirst())); } orderedKeys.clear(); // for GC, avoid zombie object links orderedValues.clear(); } return using; } @Override public void write(Bytes out, @NotNull Map toWrite) { out.writeInt(toWrite.size()); toWrite.forEach((k, v) -> { keyWriter.write(out, k); valueWriter.write(out, v); }); } @Override public MapMarshaller copy() { return new MapMarshaller<>(copyIfNeeded(keyReader), copyIfNeeded(keyWriter), copyIfNeeded(valueReader), copyIfNeeded(valueWriter)); } @Override public void readMarshallable(@NotNull WireIn wireIn) { keyReader = wireIn.read(() -> "keyReader").typedMarshallable(); keyWriter = wireIn.read(() -> "keyWriter").typedMarshallable(); valueReader = wireIn.read(() -> "valueReader").typedMarshallable(); valueWriter = wireIn.read(() -> "valueWriter").typedMarshallable(); initTransients(); } @Override public void writeMarshallable(@NotNull WireOut wireOut) { wireOut.write(() -> "keyReader").typedMarshallable(keyReader); wireOut.write(() -> "keyWriter").typedMarshallable(keyWriter); wireOut.write(() -> "valueReader").typedMarshallable(valueReader); wireOut.write(() -> "valueWriter").typedMarshallable(valueWriter); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy