diff --git a/src/main/java/net/openhft/chronicle/map/BytesMapEventListener.java b/src/main/java/net/openhft/chronicle/map/BytesMapEventListener.java
index 59499f54d..7454782d0 100644
--- a/src/main/java/net/openhft/chronicle/map/BytesMapEventListener.java
+++ b/src/main/java/net/openhft/chronicle/map/BytesMapEventListener.java
@@ -36,6 +36,9 @@ import java.io.Serializable;
* alignment (see {@link ChronicleMapBuilder#entryAndValueAlignment(Alignment)}
* ), followed by the serialized value itself.
*
+ *
+ *
There are helper methods {@link ChronicleMap#readKey(Bytes, long)} and
+ * {@link ChronicleMap#readValue(Bytes, long)} that help to deal with this.
*/
public abstract class BytesMapEventListener implements Serializable {
private static final long serialVersionUID = 0L;
diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMap.java b/src/main/java/net/openhft/chronicle/map/ChronicleMap.java
index d0d06daad..1e34883cc 100755
--- a/src/main/java/net/openhft/chronicle/map/ChronicleMap.java
+++ b/src/main/java/net/openhft/chronicle/map/ChronicleMap.java
@@ -294,6 +294,10 @@ public interface ChronicleMap extends ConcurrentMap, ChronicleHash {
*/
K newKeyInstance();
+ K readKey(Bytes entry, long keyPos);
+
+ V readValue(Bytes entry, long valuePos);
+
/**
* @return the class of {@code }
*/
diff --git a/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java b/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java
index 5c5b36a77..8ab514674 100755
--- a/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java
+++ b/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java
@@ -217,6 +217,16 @@ class StatelessChronicleMap implements ChronicleMap, Closeable, Clon
return VanillaChronicleMap.newInstance(kClass, true);
}
+ @Override
+ public K readKey(Bytes entry, long keyPos) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public V readValue(Bytes entry, long valuePos) {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public Class keyClass() {
return kClass;
diff --git a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java
index 4e2317826..6b394318a 100755
--- a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java
+++ b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java
@@ -233,6 +233,33 @@ class VanillaChronicleMap,
}
}
+ @Override
+ public K readKey(Bytes entry, long keyPos) {
+ long initialPos = entry.position();
+ try {
+ entry.position(keyPos);
+ long keySize = keySizeMarshaller.readSize(entry);
+ ThreadLocalCopies copies = keyReaderProvider.getCopies(null);
+ return keyReaderProvider.get(copies, originalKeyReader).read(entry, keySize);
+ } finally {
+ entry.position(initialPos);
+ }
+ }
+
+ @Override
+ public V readValue(Bytes entry, long valuePos) {
+ long initialPos = entry.position();
+ try {
+ entry.position(valuePos);
+ long valueSize = valueSizeMarshaller.readSize(entry);
+ alignment.alignPositionAddr(entry);
+ ThreadLocalCopies copies = valueReaderProvider.getCopies(null);
+ return valueReaderProvider.get(copies, originalValueReader).read(entry, valueSize);
+ } finally {
+ entry.position(initialPos);
+ }
+ }
+
static void segmentStateNotNullImpliesCopiesNotNull(
@Nullable ThreadLocalCopies copies, @Nullable SegmentState segmentState) {
assert copies != null || segmentState == null; // segmentState != null -> copies != null
diff --git a/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java b/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java
index c227b538d..7394ebe74 100644
--- a/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java
+++ b/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java
@@ -16,6 +16,7 @@
package net.openhft.chronicle.map;
+import net.openhft.lang.io.Bytes;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
@@ -245,6 +246,16 @@ public class ReplicationCheckingMap implements ChronicleMap {
throw new UnsupportedOperationException();
}
+ @Override
+ public K readKey(Bytes entry, long keyPos) {
+ return map1.readKey(entry, keyPos);
+ }
+
+ @Override
+ public V readValue(Bytes entry, long valuePos) {
+ return map1.readValue(entry, valuePos);
+ }
+
@Override
public Class keyClass() {
return map1.keyClass();
diff --git a/src/test/java/net/openhft/chronicle/map/jsr166/map/StatelessChronicleMapTest.java b/src/test/java/net/openhft/chronicle/map/jsr166/map/StatelessChronicleMapTest.java
index fb76835e5..4461a8e23 100755
--- a/src/test/java/net/openhft/chronicle/map/jsr166/map/StatelessChronicleMapTest.java
+++ b/src/test/java/net/openhft/chronicle/map/jsr166/map/StatelessChronicleMapTest.java
@@ -19,6 +19,7 @@ package net.openhft.chronicle.map.jsr166.map;
import net.openhft.chronicle.hash.replication.TcpTransportAndNetworkConfig;
import net.openhft.chronicle.map.*;
import net.openhft.chronicle.map.jsr166.JSR166TestCase;
+import net.openhft.lang.io.Bytes;
import org.jetbrains.annotations.NotNull;
import org.junit.After;
import org.junit.Before;
@@ -198,6 +199,16 @@ public class StatelessChronicleMapTest extends JSR166TestCase {
throw new UnsupportedOperationException();
}
+ @Override
+ public K readKey(Bytes entry, long keyPos) {
+ return d.readKey(entry, keyPos);
+ }
+
+ @Override
+ public V readValue(Bytes entry, long valuePos) {
+ return d.readValue(entry, valuePos);
+ }
+
@Override
public Class keyClass() {
return d.keyClass();