This is an automated email from the ASF dual-hosted git repository.

av pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 822c90bcde6 IGNITE-28232 Get rid of @Order method feature (#12889)
822c90bcde6 is described below

commit 822c90bcde691f977035056a63852323ffb7e85d
Author: Anton Vinogradov <[email protected]>
AuthorDate: Fri Mar 20 18:50:21 2026 +0300

    IGNITE-28232 Get rid of @Order method feature (#12889)
---
 .../query/calcite/metadata/ColocationGroup.java    |  26 ++--
 .../calcite/metadata/FragmentDescription.java      |  17 ++-
 .../query/calcite/metadata/FragmentMapping.java    |  18 ++-
 .../apache/ignite/internal/MessageProcessor.java   |   2 -
 .../internal/MessageSerializerGenerator.java       |  76 ++++-------
 .../java/org/apache/ignite/internal/Order.java     |   4 -
 .../ignite/internal/MarshallerContextImpl.java     |   2 -
 .../cache/query/index/IndexKeyTypeMessage.java     |  24 +++-
 .../communication/GridIoMessageFactory.java        |  56 ++++----
 .../discovery/DiscoveryMessageFactory.java         |  63 ++++-----
 .../SecurityAwareCustomMessageWrapper.java         |  49 +++----
 .../eventstorage/GridEventStorageMessage.java      |   9 +-
 .../cache/CacheEntryPredicateAdapter.java          |  75 ++++++++---
 .../processors/cache/GridCacheMessage.java         |   2 +-
 .../dht/PartitionUpdateCountersMessage.java        |  33 +++--
 .../dht/preloader/GridDhtPartitionMap.java         |  86 +-----------
 .../preloader/GridDhtPartitionsFullMessage.java    |  32 +++--
 .../preloader/IgniteDhtDemandedPartitionsMap.java  |  14 +-
 .../distributed/near/GridNearGetResponse.java      |   2 +-
 .../near/GridNearSingleGetResponse.java            |   9 +-
 .../cache/query/GridCacheQueryRequest.java         |   9 +-
 .../continuous/CacheContinuousQueryEntry.java      |  76 ++++++-----
 .../cache/transactions/TxEntryValueHolder.java     |  20 +--
 .../util/distributed/SingleNodeMessage.java        |   9 +-
 .../communication/MarshallableMessage.java         |   8 +-
 .../ignite/spi/discovery/tcp/ClientImpl.java       |   2 +-
 .../ignite/spi/discovery/tcp/ServerImpl.java       |   4 +-
 .../TcpDiscoveryAbstractTraceableMessage.java      |  31 ++---
 .../messages/TcpDiscoveryCustomEventMessage.java   |  18 ++-
 .../messages/TcpDiscoveryNodeFailedMessage.java    |   3 +-
 .../tcp/messages/TcpDiscoveryNodeLeftMessage.java  |   3 +-
 .../main/resources/META-INF/classnames.properties  |   1 -
 .../CacheEntryPredicateAdapterMessageTest.java     |  59 +++++++--
 .../communication/IndexKeyTypeMessageTest.java     | 145 ++++++++++++++++-----
 .../cache/ClientSlowDiscoveryAbstractTest.java     |   2 +-
 ...teMarshallerCacheClientRequestsMappingTest.java |   4 +-
 .../db/IgniteSequentialNodeCrashRecoveryTest.java  |   2 +-
 .../IncrementalSnapshotJoiningClientTest.java      |   2 +-
 .../query/schema/IndexWithSameNameTestBase.java    |   2 +-
 .../spi/discovery/tcp/BlockTcpDiscoverySpi.java    |   2 +-
 .../spi/discovery/tcp/TcpDiscoverySelfTest.java    |   2 +-
 ...tMarshallableMessageMarshallableSerializer.java |   4 +-
 .../src/test/resources/codegen/TestMessage.java    |   4 +-
 .../resources/codegen/TestMessageSerializer.java   |   4 +-
 44 files changed, 510 insertions(+), 505 deletions(-)

diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/ColocationGroup.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/ColocationGroup.java
index 21223643e8a..3e4f8001589 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/ColocationGroup.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/ColocationGroup.java
@@ -29,19 +29,20 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
 import java.util.stream.LongStream;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.Order;
+import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState;
-import 
org.apache.ignite.internal.processors.query.calcite.message.CalciteMessage;
+import 
org.apache.ignite.internal.processors.query.calcite.message.CalciteMarshalableMessage;
 import org.apache.ignite.internal.processors.query.calcite.message.MessageType;
 import org.apache.ignite.internal.processors.query.calcite.util.Commons;
 import org.apache.ignite.internal.util.GridIntIterator;
 import org.apache.ignite.internal.util.GridIntList;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
-import org.jetbrains.annotations.Nullable;
 
 /** */
-public class ColocationGroup implements CalciteMessage {
+public class ColocationGroup implements CalciteMarshalableMessage {
     /** */
     @Order(0)
     long[] srcIds;
@@ -60,7 +61,7 @@ public class ColocationGroup implements CalciteMessage {
     private boolean primaryAssignment;
 
     /** Marshalled assignments serialization call holder. */
-    @Order(value = 2, method = "marshalledAssignments")
+    @Order(2)
     int[] marshalledAssignments;
 
     /** */
@@ -317,10 +318,10 @@ public class ColocationGroup implements CalciteMessage {
         return MessageType.COLOCATION_GROUP;
     }
 
-    /** Significantly compacts and fastens UUIDs marshalling. */
-    public @Nullable int[] marshalledAssignments() {
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(GridCacheSharedContext<?, ?> ctx) 
throws IgniteCheckedException {
         if (assignments == null || primaryAssignment)
-            return null;
+            return;
 
         Map<UUID, Integer> nodeIdxs = new HashMap<>();
 
@@ -343,16 +344,13 @@ public class ColocationGroup implements CalciteMessage {
             }
         }
 
-        return builder.build().buffer();
+        marshalledAssignments = builder.build().buffer();
     }
 
-    /** Significantly compacts and fastens UUIDs unmarshalling. */
-    public void marshalledAssignments(@Nullable int[] marshalledAssignments) {
-        if (F.isEmpty(marshalledAssignments)) {
-            assignments = null;
-
+    /** {@inheritDoc} */
+    @Override public void prepareUnmarshal(GridCacheSharedContext<?, ?> ctx) 
throws IgniteCheckedException {
+        if (F.isEmpty(marshalledAssignments))
             return;
-        }
 
         int bitsPerPart = Integer.SIZE - 
Integer.numberOfLeadingZeros(nodeIds.size());
 
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentDescription.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentDescription.java
index dce4f0f5d2f..ebba0459e4f 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentDescription.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentDescription.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import 
org.apache.ignite.internal.processors.query.calcite.message.CalciteMarshalableMessage;
@@ -118,10 +119,16 @@ public class FragmentDescription implements 
CalciteMarshalableMessage {
     }
 
     /** {@inheritDoc} */
-    @Override public void prepareMarshal(GridCacheSharedContext<?, ?> ctx) {
-        if (target != null)
+    @Override public void prepareMarshal(GridCacheSharedContext<?, ?> ctx) 
throws IgniteCheckedException {
+        if (target != null) {
             target = target.explicitMapping();
 
+            target.prepareMarshal(ctx);
+        }
+
+        if (mapping != null)
+            mapping.prepareMarshal(ctx);
+
         if (remoteSources0 == null && remoteSources != null) {
             remoteSources0 = U.newHashMap(remoteSources.size());
 
@@ -131,7 +138,11 @@ public class FragmentDescription implements 
CalciteMarshalableMessage {
     }
 
     /** {@inheritDoc} */
-    @Override public void prepareUnmarshal(GridCacheSharedContext<?, ?> ctx) {
+    @Override public void prepareUnmarshal(GridCacheSharedContext<?, ?> ctx) 
throws IgniteCheckedException {
+        target.prepareUnmarshal(ctx);
+
+        mapping.prepareUnmarshal(ctx);
+
         if (remoteSources == null && remoteSources0 != null) {
             remoteSources = U.newHashMap(remoteSources0.size());
 
diff --git 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentMapping.java
 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentMapping.java
index 14efc043a31..910b990476b 100644
--- 
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentMapping.java
+++ 
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/FragmentMapping.java
@@ -23,8 +23,10 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.Order;
-import 
org.apache.ignite.internal.processors.query.calcite.message.CalciteMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
+import 
org.apache.ignite.internal.processors.query.calcite.message.CalciteMarshalableMessage;
 import org.apache.ignite.internal.processors.query.calcite.message.MessageType;
 import org.apache.ignite.internal.processors.query.calcite.util.Commons;
 import org.apache.ignite.internal.util.typedef.F;
@@ -34,7 +36,7 @@ import org.jetbrains.annotations.NotNull;
 /**
  *
  */
-public class FragmentMapping implements CalciteMessage {
+public class FragmentMapping implements CalciteMarshalableMessage {
     /** */
     @Order(0)
     List<ColocationGroup> colocationGrps;
@@ -177,4 +179,16 @@ public class FragmentMapping implements CalciteMessage {
     @Override public MessageType type() {
         return MessageType.FRAGMENT_MAPPING;
     }
+
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(GridCacheSharedContext<?, ?> ctx) 
throws IgniteCheckedException {
+        for (ColocationGroup grp : colocationGrps)
+            grp.prepareMarshal(ctx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void prepareUnmarshal(GridCacheSharedContext<?, ?> ctx) 
throws IgniteCheckedException {
+        for (ColocationGroup grp : colocationGrps)
+            grp.prepareUnmarshal(ctx);
+    }
 }
diff --git 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java
 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java
index f6cf23d4b71..46dbd39dac8 100644
--- 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java
+++ 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java
@@ -54,8 +54,6 @@ import static 
org.apache.ignite.internal.MessageSerializerGenerator.DLFT_ENUM_MA
  * <ul>
  *   <li>The target class must implement the {@code Message} interface.</li>
  *   <li>Each field to be serialized must be annotated with {@code 
@Order}.</li>
- *   <li>If {@link Order#method()} attribute was set, then each serializing 
field
- *   must have a getter named {@code method()} and a setter named {@code 
method(value)}.</li>
  * </ul>
  *
  * <p>
diff --git 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
index 723adfd9852..fef259eec6a 100644
--- 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
+++ 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
@@ -31,7 +31,6 @@ import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.UUID;
@@ -53,7 +52,6 @@ import javax.tools.FileObject;
 import javax.tools.JavaFileObject;
 import javax.tools.StandardLocation;
 import 
org.apache.ignite.internal.systemview.SystemViewRowAttributeWalkerProcessor;
-import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.jetbrains.annotations.Nullable;
 
@@ -390,9 +388,7 @@ public class MessageSerializerGenerator {
      * @param field Field to generate write code.
      */
     private void returnFalseIfWriteFailed(VariableElement field) throws 
Exception {
-        String methodName = field.getAnnotation(Order.class).method();
-
-        String getExpr = F.isEmpty(methodName) ? 
field.getSimpleName().toString() : methodName + "()";
+        String getExpr = field.getSimpleName().toString();
 
         TypeMirror type = field.asType();
 
@@ -557,18 +553,12 @@ public class MessageSerializerGenerator {
     private void returnFalseIfWriteFailed(Collection<String> code, 
VariableElement field, String accessor, @Nullable String... args) {
         String argsStr = String.join(", ", args);
 
-        String methodName = field.getAnnotation(Order.class).method();
-
-        if (Objects.equals(methodName, "")) {
-            if (type.equals(field.getEnclosingElement()))
-                code.add(identedLine("if (!%s(msg.%s))", accessor, argsStr));
-            else {
-                // Field has to be requested from a super class object.
-                code.add(identedLine("if (!%s(((%s)msg).%s))", accessor, 
field.getEnclosingElement().getSimpleName(), argsStr));
-            }
-        }
-        else
+        if (type.equals(field.getEnclosingElement()))
             code.add(identedLine("if (!%s(msg.%s))", accessor, argsStr));
+        else {
+            // Field has to be requested from a super class object.
+            code.add(identedLine("if (!%s(((%s)msg).%s))", accessor, 
field.getEnclosingElement().getSimpleName(), argsStr));
+        }
 
         indent++;
 
@@ -586,19 +576,13 @@ public class MessageSerializerGenerator {
         String writerCall,
         String mapperCall,
         String fieldGetterCall) {
-        String methodName = field.getAnnotation(Order.class).method();
-
-        if (Objects.equals(methodName, "")) {
-            if (type.equals(field.getEnclosingElement()))
-                code.add(identedLine("if (!%s(%s(msg.%s)))", writerCall, 
mapperCall, fieldGetterCall));
-            else {
-                // Field has to be requested from a super class object.
-                code.add(identedLine("if (!%s(%s(((%s)msg).%s)))",
-                    writerCall, mapperCall, 
field.getEnclosingElement().getSimpleName(), fieldGetterCall));
-            }
-        }
-        else
+        if (type.equals(field.getEnclosingElement()))
             code.add(identedLine("if (!%s(%s(msg.%s)))", writerCall, 
mapperCall, fieldGetterCall));
+        else {
+            // Field has to be requested from a super class object.
+            code.add(identedLine("if (!%s(%s(((%s)msg).%s)))",
+                writerCall, mapperCall, 
field.getEnclosingElement().getSimpleName(), fieldGetterCall));
+        }
 
         indent++;
 
@@ -895,19 +879,13 @@ public class MessageSerializerGenerator {
     private void returnFalseIfReadFailed(VariableElement field, String mtd, 
String... args) {
         String argsStr = String.join(", ", args);
 
-        String methodName = field.getAnnotation(Order.class).method();
-
-        if (Objects.equals(methodName, "")) {
-            if (type.equals(field.getEnclosingElement()))
-                read.add(identedLine("msg.%s = %s(%s);", 
field.getSimpleName().toString(), mtd, argsStr));
-            else {
-                // Field has to be requested from a super class object.
-                read.add(identedLine("((%s)msg).%s = %s(%s);",
-                    field.getEnclosingElement().getSimpleName(), 
field.getSimpleName().toString(), mtd, argsStr));
-            }
+        if (type.equals(field.getEnclosingElement()))
+            read.add(identedLine("msg.%s = %s(%s);", 
field.getSimpleName().toString(), mtd, argsStr));
+        else {
+            // Field has to be requested from a super class object.
+            read.add(identedLine("((%s)msg).%s = %s(%s);",
+                field.getEnclosingElement().getSimpleName(), 
field.getSimpleName().toString(), mtd, argsStr));
         }
-        else
-            read.add(identedLine("msg.%s(%s(%s));", methodName, mtd, argsStr));
 
         read.add(EMPTY);
 
@@ -933,19 +911,13 @@ public class MessageSerializerGenerator {
         else
             readOp = line("%s(%s, reader.readByte())", mapperDecodeCallStmnt, 
enumValuesFieldName);
 
-        String methodName = field.getAnnotation(Order.class).method();
-
-        if (Objects.equals(methodName, "")) {
-            if (type.equals(field.getEnclosingElement()))
-                read.add(identedLine("msg.%s = %s;", 
field.getSimpleName().toString(), readOp));
-            else {
-                // Field has to be requested from a super class object.
-                read.add(identedLine("((%s)msg).%s = %s;",
-                    field.getEnclosingElement().getSimpleName(), 
field.getSimpleName().toString(), readOp));
-            }
+        if (type.equals(field.getEnclosingElement()))
+            read.add(identedLine("msg.%s = %s;", 
field.getSimpleName().toString(), readOp));
+        else {
+            // Field has to be requested from a super class object.
+            read.add(identedLine("((%s)msg).%s = %s;",
+                field.getEnclosingElement().getSimpleName(), 
field.getSimpleName().toString(), readOp));
         }
-        else
-            read.add(identedLine("msg.%s(%s);", methodName, readOp));
 
         read.add(EMPTY);
 
diff --git 
a/modules/codegen/src/main/java/org/apache/ignite/internal/Order.java 
b/modules/codegen/src/main/java/org/apache/ignite/internal/Order.java
index d24214baa88..0e4562537c4 100644
--- a/modules/codegen/src/main/java/org/apache/ignite/internal/Order.java
+++ b/modules/codegen/src/main/java/org/apache/ignite/internal/Order.java
@@ -29,7 +29,6 @@ import java.lang.annotation.Target;
  * Fields annotated with {@code @Order} are processed in ascending order of 
their index.
  * <p> By default, it is assumed that getters and setters are named as the 
annotated fields,
  * e.g. field 'val' should have getters and satters with name 'val' (according 
Ignite's to code-style).
- * If you need to override this behavior, you can specify their name in the 
{@link #method} attribute.
  * <p> This annotation must be used on non-static fields, and access to those 
fields
  * should be performed strictly through corresponding getter and setter methods
  * following the naming convention: {@code fieldName()} for getter and {@code 
fieldName(Type)} for setter.
@@ -39,7 +38,4 @@ import java.lang.annotation.Target;
 public @interface Order {
     /** @return Order of the field. */
     int value();
-
-    /** @return Getter and setter name. */
-    String method() default "";
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
index 9191ceddfb1..8fa94b71df7 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
@@ -45,7 +45,6 @@ import org.apache.ignite.compute.ComputeTaskContinuousMapper;
 import org.apache.ignite.compute.ComputeTaskSession;
 import org.apache.ignite.internal.executor.GridExecutorService;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap;
-import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap;
 import 
org.apache.ignite.internal.processors.cache.persistence.filename.SharedFileTree;
 import org.apache.ignite.internal.processors.closure.GridClosureProcessor;
 import org.apache.ignite.internal.processors.marshaller.MappedName;
@@ -146,7 +145,6 @@ public class MarshallerContextImpl implements 
MarshallerContext {
             });
 
             checkHasClassName(GridDhtPartitionFullMap.class.getName(), ldr, 
CLS_NAMES_FILE);
-            checkHasClassName(GridDhtPartitionMap.class.getName(), ldr, 
CLS_NAMES_FILE);
             checkHasClassName(HashMap.class.getName(), ldr, 
JDK_CLS_NAMES_FILE);
         }
         catch (IOException e) {
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java
index c5394ad3d41..b21289fcc04 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java
@@ -17,14 +17,16 @@
 
 package org.apache.ignite.internal.cache.query.index;
 
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyType;
 import org.apache.ignite.internal.managers.communication.GridIoMessageFactory;
-import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.plugin.extensions.communication.MarshallableMessage;
 import org.jetbrains.annotations.Nullable;
 
 /** Message wrapper for {@link IndexKeyType}. */
-public class IndexKeyTypeMessage implements Message {
+public class IndexKeyTypeMessage implements MarshallableMessage {
     /** Type code. */
     public static final short TYPE_CODE = 516;
 
@@ -35,8 +37,8 @@ public class IndexKeyTypeMessage implements Message {
     private @Nullable IndexKeyType val;
 
     /** Code. */
-    @Order(value = 0, method = "code")
-    byte code = NULL_VALUE_CODE;
+    @Order(0)
+    byte code;
 
     /** Empty constructor for {@link GridIoMessageFactory}. */
     public IndexKeyTypeMessage() {
@@ -51,7 +53,8 @@ public class IndexKeyTypeMessage implements Message {
 
     /** Constructor. */
     public IndexKeyTypeMessage(int keyTypeCode) {
-        code((byte)keyTypeCode);
+        code = (byte)keyTypeCode;
+        val = decode(code);
     }
 
     /** @return Code. */
@@ -64,7 +67,6 @@ public class IndexKeyTypeMessage implements Message {
      */
     public void code(byte code) {
         this.code = code;
-        val = decode(code);
     }
 
     /** @return Index key type. */
@@ -94,4 +96,14 @@ public class IndexKeyTypeMessage implements Message {
     @Override public short directType() {
         return TYPE_CODE;
     }
+
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
+        code = encode(val);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader 
clsLdr) throws IgniteCheckedException {
+        val = decode(code);
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
index 52e124e95c4..978f4e0f584 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java
@@ -42,7 +42,7 @@ import org.apache.ignite.internal.TxEntriesInfoSerializer;
 import org.apache.ignite.internal.TxInfo;
 import org.apache.ignite.internal.TxInfoSerializer;
 import org.apache.ignite.internal.cache.query.index.IndexKeyTypeMessage;
-import 
org.apache.ignite.internal.cache.query.index.IndexKeyTypeMessageSerializer;
+import 
org.apache.ignite.internal.cache.query.index.IndexKeyTypeMessageMarshallableSerializer;
 import org.apache.ignite.internal.cache.query.index.IndexQueryResultMeta;
 import 
org.apache.ignite.internal.cache.query.index.IndexQueryResultMetaSerializer;
 import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyDefinition;
@@ -72,7 +72,7 @@ import 
org.apache.ignite.internal.processors.authentication.UserManagementOperat
 import org.apache.ignite.internal.processors.cache.CacheEntryInfoCollection;
 import 
org.apache.ignite.internal.processors.cache.CacheEntryInfoCollectionSerializer;
 import org.apache.ignite.internal.processors.cache.CacheEntryPredicateAdapter;
-import 
org.apache.ignite.internal.processors.cache.CacheEntryPredicateAdapterSerializer;
+import 
org.apache.ignite.internal.processors.cache.CacheEntryPredicateAdapterMarshallableSerializer;
 import org.apache.ignite.internal.processors.cache.CacheEvictionEntry;
 import 
org.apache.ignite.internal.processors.cache.CacheEvictionEntrySerializer;
 import org.apache.ignite.internal.processors.cache.CacheInvokeDirectResult;
@@ -132,7 +132,7 @@ import 
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrep
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnlockRequest;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnlockRequestSerializer;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessage;
-import 
org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessageSerializer;
+import 
org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessageMarshallableSerializer;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.TransactionAttributesAwareRequest;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.TransactionAttributesAwareRequestSerializer;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.atomic.AtomicApplicationAttributesAwareRequest;
@@ -186,7 +186,7 @@ import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.Gri
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessageSerializer;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage;
-import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessageSerializer;
+import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessageMarshallableSerializer;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleMessage;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleMessageSerializer;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsSingleRequest;
@@ -268,7 +268,7 @@ import 
org.apache.ignite.internal.processors.cache.query.GridCacheSqlQuerySerial
 import 
org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryBatchAck;
 import 
org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryBatchAckSerializer;
 import 
org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryEntry;
-import 
org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryEntrySerializer;
+import 
org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryEntryMarshallableSerializer;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry;
 import 
org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntrySerializer;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey;
@@ -377,18 +377,18 @@ import 
org.apache.ignite.spi.communication.tcp.messages.RecoveryLastReceivedMess
  */
 public class GridIoMessageFactory implements MessageFactoryProvider {
     /** Custom data marshaller. */
-    private final Marshaller cstDataMarshall;
+    private final Marshaller marsh;
 
     /** Class loader for the custom data marshalling. */
-    private final ClassLoader cstDataMarshallClsLdr;
+    private final ClassLoader clsLdr;
 
     /**
-     * @param cstDataMarshall Custom data marshaller.
-     * @param cstDataMarshallClsLdr Class loader for the custom data 
marshalling.
+     * @param marsh Custom data marshaller.
+     * @param clsLdr Class loader for the custom data marshalling.
      */
-    public GridIoMessageFactory(Marshaller cstDataMarshall, ClassLoader 
cstDataMarshallClsLdr) {
-        this.cstDataMarshall = cstDataMarshall;
-        this.cstDataMarshallClsLdr = cstDataMarshallClsLdr;
+    public GridIoMessageFactory(Marshaller marsh, ClassLoader clsLdr) {
+        this.marsh = marsh;
+        this.clsLdr = clsLdr;
     }
 
     /** {@inheritDoc} */
@@ -396,7 +396,7 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         // -54 is reserved for SQL.
         // We don't use the code‑generated serializer for CompressedMessage - 
serialization is highly customized.
         factory.register(CompressedMessage.TYPE_CODE, CompressedMessage::new);
-        factory.register((short)-66, ErrorMessage::new, new 
ErrorMessageMarshallableSerializer(cstDataMarshall, cstDataMarshallClsLdr));
+        factory.register((short)-66, ErrorMessage::new, new 
ErrorMessageMarshallableSerializer(marsh, clsLdr));
         factory.register((short)-65, TxInfo::new, new TxInfoSerializer());
         factory.register((short)-64, TxEntriesInfo::new, new 
TxEntriesInfoSerializer());
         factory.register((short)-63, ExchangeInfo::new, new 
ExchangeInfoSerializer());
@@ -429,13 +429,13 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)6, GridTaskSessionRequest::new, new 
GridTaskSessionRequestSerializer());
         factory.register((short)7, GridCheckpointRequest::new, new 
GridCheckpointRequestSerializer());
         factory.register((short)8, GridIoMessage::new,
-            new GridIoMessageMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new GridIoMessageMarshallableSerializer(marsh, clsLdr));
         factory.register((short)9, GridIoUserMessage::new, new 
GridIoUserMessageSerializer());
         factory.register((short)10, GridDeploymentInfoBean::new, new 
GridDeploymentInfoBeanSerializer());
         factory.register((short)11, GridDeploymentRequest::new, new 
GridDeploymentRequestSerializer());
         factory.register((short)12, GridDeploymentResponse::new, new 
GridDeploymentResponseSerializer());
         factory.register((short)13, GridEventStorageMessage::new,
-            new GridEventStorageMessageMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new GridEventStorageMessageMarshallableSerializer(marsh, clsLdr));
         factory.register((short)16, GridCacheTxRecoveryRequest::new, new 
GridCacheTxRecoveryRequestSerializer());
         factory.register((short)17, GridCacheTxRecoveryResponse::new, new 
GridCacheTxRecoveryResponseSerializer());
         factory.register((short)18, IndexQueryResultMeta::new, new 
IndexQueryResultMetaSerializer());
@@ -465,7 +465,8 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)42, GridDhtForceKeysRequest::new, new 
GridDhtForceKeysRequestSerializer());
         factory.register((short)43, GridDhtForceKeysResponse::new, new 
GridDhtForceKeysResponseSerializer());
         factory.register((short)45, GridDhtPartitionDemandMessage::new, new 
GridDhtPartitionDemandMessageSerializer());
-        factory.register((short)46, GridDhtPartitionsFullMessage::new, new 
GridDhtPartitionsFullMessageSerializer());
+        factory.register((short)46, GridDhtPartitionsFullMessage::new,
+            new GridDhtPartitionsFullMessageMarshallableSerializer(marsh, 
clsLdr));
         factory.register((short)47, GridDhtPartitionsSingleMessage::new, new 
GridDhtPartitionsSingleMessageSerializer());
         factory.register((short)48, GridDhtPartitionsSingleRequest::new, new 
GridDhtPartitionsSingleRequestSerializer());
         factory.register((short)49, GridNearGetRequest::new, new 
GridNearGetRequestSerializer());
@@ -498,9 +499,9 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)93, CacheInvokeDirectResult::new, new 
CacheInvokeDirectResultSerializer());
         factory.register((short)94, IgniteTxKey::new, new 
IgniteTxKeySerializer());
         factory.register((short)95, DataStreamerEntry::new, new 
DataStreamerEntrySerializer());
-        factory.register((short)96, CacheContinuousQueryEntry::new, new 
CacheContinuousQueryEntrySerializer());
+        factory.register((short)96, CacheContinuousQueryEntry::new, new 
CacheContinuousQueryEntryMarshallableSerializer(marsh, clsLdr));
         factory.register((short)97, CacheEvictionEntry::new, new 
CacheEvictionEntrySerializer());
-        factory.register((short)98, CacheEntryPredicateAdapter::new, new 
CacheEntryPredicateAdapterSerializer());
+        factory.register((short)98, CacheEntryPredicateAdapter::new, new 
CacheEntryPredicateAdapterMarshallableSerializer(marsh, clsLdr));
         factory.register((short)100, IgniteTxEntry::new, new 
IgniteTxEntrySerializer());
         factory.register((short)101, TxEntryValueHolder::new, new 
TxEntryValueHolderSerializer());
         factory.register((short)102, CacheVersionedValue::new, new 
CacheVersionedValueSerializer());
@@ -534,7 +535,8 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register(CacheMetricsMessage.TYPE_CODE, 
CacheMetricsMessage::new, new CacheMetricsMessageSerializer());
         factory.register(NodeMetricsMessage.TYPE_CODE, 
NodeMetricsMessage::new, new NodeMetricsMessageSerializer());
         factory.register(NodeFullMetricsMessage.TYPE_CODE, 
NodeFullMetricsMessage::new, new NodeFullMetricsMessageSerializer());
-        factory.register((short)157, PartitionUpdateCountersMessage::new, new 
PartitionUpdateCountersMessageSerializer());
+        factory.register((short)157, PartitionUpdateCountersMessage::new,
+            new PartitionUpdateCountersMessageMarshallableSerializer(marsh, 
clsLdr));
         factory.register((short)162, GenerateEncryptionKeyRequest::new, new 
GenerateEncryptionKeyRequestSerializer());
         factory.register((short)163, GenerateEncryptionKeyResponse::new, new 
GenerateEncryptionKeyResponseSerializer());
         factory.register((short)167, ServiceDeploymentProcessId::new, new 
ServiceDeploymentProcessIdSerializer());
@@ -543,7 +545,7 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register(GridQueryKillRequest.TYPE_CODE, 
GridQueryKillRequest::new, new GridQueryKillRequestSerializer());
         factory.register(GridQueryKillResponse.TYPE_CODE, 
GridQueryKillResponse::new, new GridQueryKillResponseSerializer());
         factory.register(GridIoSecurityAwareMessage.TYPE_CODE, 
GridIoSecurityAwareMessage::new,
-            new 
GridIoSecurityAwareMessageMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new GridIoSecurityAwareMessageMarshallableSerializer(marsh, 
clsLdr));
         factory.register(SessionChannelMessage.TYPE_CODE, 
SessionChannelMessage::new, new SessionChannelMessageSerializer());
         factory.register(SingleNodeMessage.TYPE_CODE, SingleNodeMessage::new, 
new SingleNodeMessageSerializer());
         factory.register((short)177, TcpInverseConnectionResponseMessage::new, 
new TcpInverseConnectionResponseMessageSerializer());
@@ -585,7 +587,8 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register(IgniteDhtPartitionsToReloadMap.TYPE_CODE, 
IgniteDhtPartitionsToReloadMap::new,
             new IgniteDhtPartitionsToReloadMapSerializer());
         factory.register(IntLongMap.TYPE_CODE, IntLongMap::new, new 
IntLongMapSerializer());
-        factory.register(IndexKeyTypeMessage.TYPE_CODE, 
IndexKeyTypeMessage::new, new IndexKeyTypeMessageSerializer());
+        factory.register(IndexKeyTypeMessage.TYPE_CODE, 
IndexKeyTypeMessage::new,
+            new IndexKeyTypeMessageMarshallableSerializer(marsh, clsLdr));
         factory.register(GridPartitionStateMap.TYPE_CODE, 
GridPartitionStateMap::new, new GridPartitionStateMapSerializer());
         factory.register(GridDhtPartitionMap.TYPE_CODE, 
GridDhtPartitionMap::new, new GridDhtPartitionMapSerializer());
         factory.register(GridDhtPartitionFullMap.TYPE_CODE, 
GridDhtPartitionFullMap::new, new GridDhtPartitionFullMapSerializer());
@@ -594,17 +597,16 @@ public class GridIoMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)522, DataStreamerUpdatesHandlerResult::new, 
new DataStreamerUpdatesHandlerResultSerializer());
         factory.register((short)523, SnapshotCheckResponse::new, new 
SnapshotCheckResponseSerializer());
         factory.register((short)524, IncrementalSnapshotVerifyResult::new,
-            new 
IncrementalSnapshotVerifyResultMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new IncrementalSnapshotVerifyResultMarshallableSerializer(marsh, 
clsLdr));
         factory.register((short)525, SnapshotRestoreOperationResponse::new,
-            new 
SnapshotRestoreOperationResponseMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
-        factory.register((short)526, SnapshotMetadataResponse::new,
-            new 
SnapshotMetadataResponseMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new SnapshotRestoreOperationResponseMarshallableSerializer(marsh, 
clsLdr));
+        factory.register((short)526, SnapshotMetadataResponse::new, new 
SnapshotMetadataResponseMarshallableSerializer(marsh, clsLdr));
         factory.register((short)527, SnapshotCheckPartitionHashesResponse::new,
-            new 
SnapshotCheckPartitionHashesResponseMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new 
SnapshotCheckPartitionHashesResponseMarshallableSerializer(marsh, clsLdr));
         factory.register((short)528, SnapshotCheckHandlersResponse::new, new 
SnapshotCheckHandlersResponseSerializer());
         factory.register((short)529, SnapshotCheckHandlersNodeResponse::new, 
new SnapshotCheckHandlersNodeResponseSerializer());
         factory.register((short)530, 
SnapshotPartitionsVerifyHandlerResponse::new,
-            new 
SnapshotPartitionsVerifyHandlerResponseMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new 
SnapshotPartitionsVerifyHandlerResponseMarshallableSerializer(marsh, clsLdr));
 
         // [-3..119] [124..129] [-23..-28] [-36..-55] [183..188] - this
         // [120..123] - DR
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java
index f4038f87f86..69800247c4b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java
@@ -143,7 +143,7 @@ import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCollectionMessag
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryConnectionCheckMessage;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryConnectionCheckMessageSerializer;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCustomEventMessage;
-import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCustomEventMessageSerializer;
+import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryCustomEventMessageMarshallableSerializer;
 import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDiscardMessage;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDiscardMessageSerializer;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryDuplicateIdMessage;
@@ -163,11 +163,11 @@ import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddFinishedM
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddedMessage;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddedMessageMarshallableSerializer;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeFailedMessage;
-import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeFailedMessageSerializer;
+import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeFailedMessageMarshallableSerializer;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeFullMetricsMessage;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeFullMetricsMessageSerializer;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeLeftMessage;
-import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeLeftMessageSerializer;
+import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeLeftMessageMarshallableSerializer;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeMetricsMessage;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeMetricsMessageSerializer;
 import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryPingRequest;
@@ -177,43 +177,42 @@ import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryPingResponseSeri
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryRingLatencyCheckMessage;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryRingLatencyCheckMessageSerializer;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryServerOnlyCustomEventMessage;
-import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryServerOnlyCustomEventMessageSerializer;
+import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryServerOnlyCustomEventMessageMarshallableSerializer;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusCheckMessage;
 import 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusCheckMessageSerializer;
 
 /** Message factory for discovery messages. */
 public class DiscoveryMessageFactory implements MessageFactoryProvider {
     /** Custom data marshaller. */
-    private final Marshaller cstDataMarshall;
+    private final Marshaller marsh;
 
     /** Class loader for the custom data marshalling. */
-    private final ClassLoader cstDataMarshallClsLdr;
+    private final ClassLoader clsLdr;
 
     /**
-     * @param cstDataMarshall Custom data marshaller.
-     * @param cstDataMarshallClsLdr Class loader for the custom data 
marshalling.
+     * @param marsh Custom data marshaller.
+     * @param clsLdr Class loader for the custom data marshalling.
      */
-    public DiscoveryMessageFactory(Marshaller cstDataMarshall, ClassLoader 
cstDataMarshallClsLdr) {
-        this.cstDataMarshall = cstDataMarshall;
-        this.cstDataMarshallClsLdr = cstDataMarshallClsLdr;
+    public DiscoveryMessageFactory(Marshaller marsh, ClassLoader clsLdr) {
+        this.marsh = marsh;
+        this.clsLdr = clsLdr;
     }
 
     /** {@inheritDoc} */
     @Override public void registerAll(MessageFactory factory) {
         factory.register((short)-200, TcpDiscoveryCollectionMessage::new,
-            new 
TcpDiscoveryCollectionMessageMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new TcpDiscoveryCollectionMessageMarshallableSerializer(marsh, 
clsLdr));
 
         factory.register((short)-115, SchemaAlterTableAddColumnOperation::new,
             new SchemaAlterTableAddColumnOperationSerializer());
         factory.register((short)-114, SchemaIndexCreateOperation::new,
-            new 
SchemaIndexCreateOperationMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new SchemaIndexCreateOperationMarshallableSerializer(marsh, 
clsLdr));
         factory.register((short)-113, SchemaIndexDropOperation::new, new 
SchemaIndexDropOperationSerializer());
         factory.register((short)-112, SchemaAlterTableDropColumnOperation::new,
             new SchemaAlterTableDropColumnOperationSerializer());
         factory.register((short)-111, SchemaAddQueryEntityOperation::new,
-            new 
SchemaAddQueryEntityOperationMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
-        factory.register((short)-110, QueryField::new, new 
QueryFieldMarshallableSerializer(cstDataMarshall,
-            cstDataMarshallClsLdr));
+            new SchemaAddQueryEntityOperationMarshallableSerializer(marsh, 
clsLdr));
+        factory.register((short)-110, QueryField::new, new 
QueryFieldMarshallableSerializer(marsh, clsLdr));
         factory.register((short)-109, User::new, new UserSerializer());
         factory.register((short)-108, UserManagementOperation::new, new 
UserManagementOperationSerializer());
         factory.register((short)-107, NodeSpecificData::new, new 
NodeSpecificDataSerializer());
@@ -225,7 +224,7 @@ public class DiscoveryMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)-102, TcpDiscoveryNodeMetricsMessage::new, new 
TcpDiscoveryNodeMetricsMessageSerializer());
         factory.register((short)-101, InetSocketAddressMessage::new, new 
InetSocketAddressMessageSerializer());
         factory.register((short)-100, InetAddressMessage::new, new 
InetAddressMessageSerializer());
-        factory.register((short)-66, ErrorMessage::new, new 
ErrorMessageMarshallableSerializer(cstDataMarshall, cstDataMarshallClsLdr));
+        factory.register((short)-66, ErrorMessage::new, new 
ErrorMessageMarshallableSerializer(marsh, clsLdr));
 
         // TcpDiscoveryAbstractMessage
         factory.register((short)0, TcpDiscoveryCheckFailedMessage::new, new 
TcpDiscoveryCheckFailedMessageSerializer());
@@ -244,16 +243,18 @@ public class DiscoveryMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)13, 
TcpDiscoveryClientMetricsUpdateMessage::new, new 
TcpDiscoveryClientMetricsUpdateMessageSerializer());
         factory.register((short)14, TcpDiscoveryMetricsUpdateMessage::new, new 
TcpDiscoveryMetricsUpdateMessageSerializer());
         factory.register((short)15, TcpDiscoveryClientAckResponse::new, new 
TcpDiscoveryClientAckResponseSerializer());
-        factory.register((short)16, TcpDiscoveryNodeLeftMessage::new, new 
TcpDiscoveryNodeLeftMessageSerializer());
-        factory.register((short)17, TcpDiscoveryNodeFailedMessage::new, new 
TcpDiscoveryNodeFailedMessageSerializer());
+        factory.register((short)16, TcpDiscoveryNodeLeftMessage::new, new 
TcpDiscoveryNodeLeftMessageMarshallableSerializer(marsh, clsLdr));
+        factory.register((short)17, TcpDiscoveryNodeFailedMessage::new,
+            new TcpDiscoveryNodeFailedMessageMarshallableSerializer(marsh, 
clsLdr));
         factory.register((short)18, TcpDiscoveryStatusCheckMessage::new, new 
TcpDiscoveryStatusCheckMessageSerializer());
         factory.register((short)19, TcpDiscoveryNodeAddFinishedMessage::new,
-            new 
TcpDiscoveryNodeAddFinishedMessageMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new 
TcpDiscoveryNodeAddFinishedMessageMarshallableSerializer(marsh, clsLdr));
         factory.register((short)20, TcpDiscoveryJoinRequestMessage::new,
-            new 
TcpDiscoveryJoinRequestMessageMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
-        factory.register((short)21, TcpDiscoveryCustomEventMessage::new, new 
TcpDiscoveryCustomEventMessageSerializer());
+            new TcpDiscoveryJoinRequestMessageMarshallableSerializer(marsh, 
clsLdr));
+        factory.register((short)21, TcpDiscoveryCustomEventMessage::new,
+            new TcpDiscoveryCustomEventMessageMarshallableSerializer(marsh, 
clsLdr));
         factory.register((short)22, 
TcpDiscoveryServerOnlyCustomEventMessage::new,
-            new TcpDiscoveryServerOnlyCustomEventMessageSerializer());
+            new 
TcpDiscoveryServerOnlyCustomEventMessageMarshallableSerializer(marsh, clsLdr));
         factory.register((short)23, TcpConnectionRequestDiscoveryMessage::new, 
new TcpConnectionRequestDiscoveryMessageSerializer());
         factory.register((short)24, DistributedMetaStorageUpdateMessage::new, 
new DistributedMetaStorageUpdateMessageSerializer());
         factory.register((short)25, 
DistributedMetaStorageUpdateAckMessage::new, new 
DistributedMetaStorageUpdateAckMessageSerializer());
@@ -261,14 +262,15 @@ public class DiscoveryMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)27, DistributedMetaStorageCasAckMessage::new, 
new DistributedMetaStorageCasAckMessageSerializer());
         factory.register((short)28, TcpDiscoveryClientReconnectMessage::new, 
new TcpDiscoveryClientReconnectMessageSerializer());
         factory.register((short)29, TcpDiscoveryNodeAddedMessage::new,
-            new 
TcpDiscoveryNodeAddedMessageMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new TcpDiscoveryNodeAddedMessageMarshallableSerializer(marsh, 
clsLdr));
         factory.register((short)30, FullMessage::new, new 
FullMessageSerializer());
 
         factory.register((short)86, GridCacheVersion::new, new 
GridCacheVersionSerializer());
 
         // DiscoveryCustomMessage
         factory.register((short)500, CacheStatisticsModeChangeMessage::new, 
new CacheStatisticsModeChangeMessageSerializer());
-        factory.register((short)501, SecurityAwareCustomMessageWrapper::new, 
new SecurityAwareCustomMessageWrapperSerializer());
+        factory.register((short)501, SecurityAwareCustomMessageWrapper::new,
+            new SecurityAwareCustomMessageWrapperMarshallableSerializer(marsh, 
clsLdr));
         factory.register((short)502, MetadataRemoveAcceptedMessage::new, new 
MetadataRemoveAcceptedMessageSerializer());
         factory.register((short)503, MetadataRemoveProposedMessage::new, new 
MetadataRemoveProposedMessageSerializer());
         factory.register((short)504, SchemaProposeDiscoveryMessage::new, new 
SchemaProposeDiscoveryMessageSerializer());
@@ -294,16 +296,15 @@ public class DiscoveryMessageFactory implements 
MessageFactoryProvider {
         factory.register((short)522, DataStreamerUpdatesHandlerResult::new, 
new DataStreamerUpdatesHandlerResultSerializer());
         factory.register((short)523, SnapshotCheckResponse::new, new 
SnapshotCheckResponseSerializer());
         factory.register((short)524, IncrementalSnapshotVerifyResult::new,
-            new 
IncrementalSnapshotVerifyResultMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new IncrementalSnapshotVerifyResultMarshallableSerializer(marsh, 
clsLdr));
         factory.register((short)525, SnapshotRestoreOperationResponse::new,
-            new 
SnapshotRestoreOperationResponseMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
-        factory.register((short)526, SnapshotMetadataResponse::new,
-            new 
SnapshotMetadataResponseMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new SnapshotRestoreOperationResponseMarshallableSerializer(marsh, 
clsLdr));
+        factory.register((short)526, SnapshotMetadataResponse::new, new 
SnapshotMetadataResponseMarshallableSerializer(marsh, clsLdr));
         factory.register((short)527, SnapshotCheckPartitionHashesResponse::new,
-            new 
SnapshotCheckPartitionHashesResponseMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new 
SnapshotCheckPartitionHashesResponseMarshallableSerializer(marsh, clsLdr));
         factory.register((short)528, SnapshotCheckHandlersResponse::new, new 
SnapshotCheckHandlersResponseSerializer());
         factory.register((short)529, SnapshotCheckHandlersNodeResponse::new, 
new SnapshotCheckHandlersNodeResponseSerializer());
         factory.register((short)530, 
SnapshotPartitionsVerifyHandlerResponse::new,
-            new 
SnapshotPartitionsVerifyHandlerResponseMarshallableSerializer(cstDataMarshall, 
cstDataMarshallClsLdr));
+            new 
SnapshotPartitionsVerifyHandlerResponseMarshallableSerializer(marsh, clsLdr));
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java
index c186fe02a1a..97d798b66b6 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java
@@ -19,19 +19,17 @@ package org.apache.ignite.internal.managers.discovery;
 
 import java.util.UUID;
 import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.Order;
-import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.plugin.extensions.communication.MarshallableMessage;
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import org.apache.ignite.spi.discovery.DiscoverySpiCustomMessage;
 import org.jetbrains.annotations.Nullable;
 
-import static org.apache.ignite.marshaller.Marshallers.jdk;
-
 /** Custom message wrapper with ID of security subject that initiated the 
current message. */
-public class SecurityAwareCustomMessageWrapper extends 
DiscoverySpiCustomMessage implements Message {
+public class SecurityAwareCustomMessageWrapper extends 
DiscoverySpiCustomMessage implements MarshallableMessage {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -43,13 +41,13 @@ public class SecurityAwareCustomMessageWrapper extends 
DiscoverySpiCustomMessage
     private DiscoveryCustomMessage delegate;
 
     /** */
-    @Order(1)
     // TODO: Should be removed in 
https://issues.apache.org/jira/browse/IGNITE-27627
+    @Order(1)
     Message msg;
 
     /** Serialized message bytes. */
     // TODO: Should be removed in 
https://issues.apache.org/jira/browse/IGNITE-27627
-    @Order(value = 2, method = "messageBytes")
+    @Order(2)
     byte[] msgBytes;
 
     /** Default constructor for {@link MessageFactory}. */
@@ -95,37 +93,20 @@ public class SecurityAwareCustomMessageWrapper extends 
DiscoverySpiCustomMessage
         return ack == null ? null : new SecurityAwareCustomMessageWrapper(ack, 
secSubjId);
     }
 
-    /** */
-    public byte[] messageBytes() {
-        if (delegate instanceof Message)
-            return null;
-
-        if (msgBytes != null)
-            return msgBytes;
-
-        try {
-            return msgBytes = U.marshal(jdk(), delegate);
-        }
-        catch (IgniteCheckedException e) {
-            throw new IgniteException(e);
-        }
+    /** {@inheritDoc} */
+    @Override public short directType() {
+        return 501;
     }
 
-    /** */
-    public void messageBytes(byte[] msgBytes) {
-        if (F.isEmpty(msgBytes))
-            return;
-
-        try {
-            delegate = U.unmarshal(jdk(), msgBytes, U.gridClassLoader());
-        }
-        catch (IgniteCheckedException e) {
-            throw new RuntimeException(e);
-        }
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
+        if (!(delegate instanceof Message))
+            msgBytes = U.marshal(marsh, delegate);
     }
 
     /** {@inheritDoc} */
-    @Override public short directType() {
-        return 501;
+    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader 
clsLdr) throws IgniteCheckedException {
+        if (msgBytes != null)
+            delegate = U.unmarshal(marsh, msgBytes, clsLdr);
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageMessage.java
index 263451596e8..6b6d4f26b38 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageMessage.java
@@ -82,7 +82,7 @@ public class GridEventStorageMessage implements 
MarshallableMessage {
 
     /** Node class loader participants. */
     @GridToStringInclude
-    @Order(value = 8, method = "loaderParticipants")
+    @Order(8)
     Map<UUID, IgniteUuid> ldrParties;
 
     /** */
@@ -191,13 +191,6 @@ public class GridEventStorageMessage implements 
MarshallableMessage {
         return ldrParties != null ? Collections.unmodifiableMap(ldrParties) : 
null;
     }
 
-    /**
-     * @param ldrParties Node class loader participant map.
-     */
-    public void loaderParticipants(@Nullable Map<UUID, IgniteUuid> ldrParties) 
{
-        this.ldrParties = ldrParties;
-    }
-
     /**
      * @return Exception.
      */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheEntryPredicateAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheEntryPredicateAdapter.java
index 0eaa1fa7a77..180d09aa93b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheEntryPredicateAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheEntryPredicateAdapter.java
@@ -23,10 +23,12 @@ import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.plugin.extensions.communication.MarshallableMessage;
 import org.jetbrains.annotations.Nullable;
 
 /** A unified container for common, typical cache entry predicates. */
-public class CacheEntryPredicateAdapter implements CacheEntryPredicate {
+public class CacheEntryPredicateAdapter implements CacheEntryPredicate, 
MarshallableMessage {
     /** */
     private static final long serialVersionUID = 4647110502545358709L;
 
@@ -41,7 +43,7 @@ public class CacheEntryPredicateAdapter implements 
CacheEntryPredicate {
     private PredicateType type;
 
     /** Type value serialization holder. */
-    @Order(value = 0, method = "code")
+    @Order(0)
     protected transient byte code;
 
     /** */
@@ -64,6 +66,7 @@ public class CacheEntryPredicateAdapter implements 
CacheEntryPredicate {
     /** */
     public CacheEntryPredicateAdapter(@Nullable CacheObject val) {
         type = PredicateType.VALUE;
+        code = 1;
 
         this.val = val;
     }
@@ -144,27 +147,65 @@ public class CacheEntryPredicateAdapter implements 
CacheEntryPredicate {
 
     /** */
     public byte code() {
-        assert type != null;
+        return code;
+    }
 
+    /** */
+    public void code(byte code) {
+        this.code = code;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
         switch (type) {
-            case OTHER: return 0;
-            case VALUE: return 1;
-            case HAS_VALUE: return 2;
-            case HAS_NO_VALUE: return 3;
-            case ALWAYS_FALSE: return 4;
-        }
+            case OTHER:
+                code = 0;
+                break;
+
+            case VALUE:
+                code = 1;
+                break;
+
+            case HAS_VALUE:
+                code = 2;
+                break;
+
+            case HAS_NO_VALUE:
+                code = 3;
+                break;
 
-        throw new IllegalArgumentException("Unknown cache entry predicate 
type: " + type);
+            case ALWAYS_FALSE:
+                code = 4;
+                break;
+
+            default:
+                throw new IllegalArgumentException("Unknown cache entry 
predicate type: " + type);
+        }
     }
 
-    /** */
-    public void code(byte code) {
+    /** {@inheritDoc} */
+    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader 
clsLdr) throws IgniteCheckedException {
         switch (code) {
-            case 0: type = PredicateType.OTHER; break;
-            case 1: type = PredicateType.VALUE; break;
-            case 2: type = PredicateType.HAS_VALUE; break;
-            case 3: type = PredicateType.HAS_NO_VALUE; break;
-            case 4: type = PredicateType.ALWAYS_FALSE; break;
+            case 0:
+                type = PredicateType.OTHER;
+                break;
+
+            case 1:
+                type = PredicateType.VALUE;
+                break;
+
+            case 2:
+                type = PredicateType.HAS_VALUE;
+                break;
+
+            case 3:
+                type = PredicateType.HAS_NO_VALUE;
+                break;
+
+            case 4:
+                type = PredicateType.ALWAYS_FALSE;
+                break;
+
             default:
                 throw new IllegalArgumentException("Unknown cache entry 
predicate type code: " + code);
         }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java
index 9b7e2e4943b..285e4d392d9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java
@@ -69,7 +69,7 @@ public abstract class GridCacheMessage implements Message {
 
     /** */
     @GridToStringInclude
-    @Order(value = 2, method = "lastAffinityChangedTopologyVersion")
+    @Order(2)
     @Nullable public AffinityTopologyVersion lastAffChangedTopVer;
 
     /** */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/PartitionUpdateCountersMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/PartitionUpdateCountersMessage.java
index b6e7743b880..f5b35d1364e 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/PartitionUpdateCountersMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/PartitionUpdateCountersMessage.java
@@ -19,20 +19,22 @@ package 
org.apache.ignite.internal.processors.cache.distributed.dht;
 
 import java.util.Arrays;
 import java.util.Map;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.plugin.extensions.communication.MarshallableMessage;
 
 /**
  * Partition update counters message.
  */
-public class PartitionUpdateCountersMessage implements Message {
+public class PartitionUpdateCountersMessage implements MarshallableMessage {
     /** */
     private static final int ITEM_SIZE = 4 /* partition */ + 8 /* initial 
counter */ + 8 /* updates count */;
 
     /** Byte representation of partition counters. */
-    @Order(value = 0, method = "data")
+    @Order(0)
     byte[] data;
 
     /** */
@@ -61,21 +63,6 @@ public class PartitionUpdateCountersMessage implements 
Message {
         data = new byte[initSize * ITEM_SIZE];
     }
 
-    /**
-     * @return Data.
-     */
-    public byte[] data() {
-        return Arrays.copyOf(data, size * ITEM_SIZE);
-    }
-
-    /**
-     * @param data New data.
-     */
-    public void data(byte[] data) {
-        this.data = data;
-        size = data == null ? 0 : data.length / ITEM_SIZE;
-    }
-
     /**
      * @return Cache id.
      */
@@ -199,4 +186,14 @@ public class PartitionUpdateCountersMessage implements 
Message {
             ", cntrs=" + sb +
             '}';
     }
+
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
+        data = Arrays.copyOf(data, size * ITEM_SIZE);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader 
clsLdr) throws IgniteCheckedException {
+        size = data == null ? 0 : data.length / ITEM_SIZE;
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionMap.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionMap.java
index b343d55d11b..7bda312f9b6 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionMap.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionMap.java
@@ -18,20 +18,15 @@
 package org.apache.ignite.internal.processors.cache.distributed.dht.preloader;
 
 import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
-import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import 
org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState;
 import org.apache.ignite.internal.util.GridPartitionStateMap;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.plugin.extensions.communication.Message;
 
 import static 
org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState.MOVING;
@@ -39,13 +34,10 @@ import static 
org.apache.ignite.internal.processors.cache.distributed.dht.topolo
 /**
  * Partition map from single node.
  */
-public class GridDhtPartitionMap implements Comparable<GridDhtPartitionMap>, 
Externalizable, Message {
+public class GridDhtPartitionMap implements Comparable<GridDhtPartitionMap>, 
Message {
     /** Type code. */
     public static final short TYPE_CODE = 518;
 
-    /** */
-    private static final long serialVersionUID = 0L;
-
     /** Node ID. */
     @Order(0)
     protected UUID nodeId;
@@ -59,11 +51,12 @@ public class GridDhtPartitionMap implements 
Comparable<GridDhtPartitionMap>, Ext
     protected AffinityTopologyVersion top;
 
     /** */
-    @Order(value = 3, method = "map")
+    @Order(3)
     protected GridPartitionStateMap map;
 
     /** */
-    private volatile int moving;
+    @Order(4)
+    volatile int moving;
 
     /** */
     private static final AtomicIntegerFieldUpdater<GridDhtPartitionMap> 
MOVING_FIELD_UPDATER =
@@ -206,17 +199,6 @@ public class GridDhtPartitionMap implements 
Comparable<GridDhtPartitionMap>, Ext
         return map;
     }
 
-    /**
-     * @param map Partitions state map.
-     */
-    public void map(GridPartitionStateMap map) {
-        this.map = new GridPartitionStateMap();
-
-        if (map != null)
-            for (Map.Entry<Integer, GridDhtPartitionState> entry : 
map.entrySet())
-                put(entry.getKey(), entry.getValue());
-    }
-
     /**
      * @return Node ID.
      */
@@ -271,66 +253,6 @@ public class GridDhtPartitionMap implements 
Comparable<GridDhtPartitionMap>, Ext
         return Long.compare(updateSeq, o.updateSeq);
     }
 
-    /** {@inheritDoc} */
-    @Override public void writeExternal(ObjectOutput out) throws IOException {
-        U.writeUuid(out, nodeId);
-
-        out.writeLong(updateSeq);
-
-        int size = map.size();
-
-        out.writeInt(size);
-
-        int i = 0;
-
-        for (Map.Entry<Integer, GridDhtPartitionState> entry : map.entrySet()) 
{
-            int ordinal = entry.getValue().ordinal();
-
-            assert ordinal == (ordinal & 0x7);
-            assert entry.getKey() < CacheConfiguration.MAX_PARTITIONS_COUNT : 
entry.getKey();
-
-            out.writeByte(ordinal);
-            out.writeShort(entry.getKey());
-
-            i++;
-        }
-
-        assert i == size : "Invalid size [size1=" + size + ", size2=" + i + 
']';
-
-        if (top != null) {
-            out.writeLong(topologyVersion().topologyVersion());
-            out.writeInt(topologyVersion().minorTopologyVersion());
-        }
-        else {
-            out.writeLong(0);
-            out.writeInt(0);
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
-        nodeId = U.readUuid(in);
-
-        updateSeq = in.readLong();
-
-        int size = in.readInt();
-
-        map = new GridPartitionStateMap();
-
-        for (int i = 0; i < size; i++) {
-            int ordinal = in.readUnsignedByte();
-            int part = in.readUnsignedShort();
-
-            put(part, GridDhtPartitionState.fromOrdinal(ordinal));
-        }
-
-        long ver = in.readLong();
-        int minorVer = in.readInt();
-
-        if (ver != 0)
-            top = new AffinityTopologyVersion(ver, minorVer);
-    }
-
     /** {@inheritDoc} */
     @Override public boolean equals(Object o) {
         if (this == o)
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
index 37079381e9f..98403fbf1ba 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
@@ -40,6 +40,8 @@ import 
org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.plugin.extensions.communication.MarshallableMessage;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -48,7 +50,7 @@ import org.jetbrains.annotations.Nullable;
  * GridDhtPartitionsSingleMessage}s were received. <br> May be also compacted 
as part of {@link
  * CacheAffinityChangeMessage} for node left or failed case.<br>
  */
-public class GridDhtPartitionsFullMessage extends 
GridDhtPartitionsAbstractMessage {
+public class GridDhtPartitionsFullMessage extends 
GridDhtPartitionsAbstractMessage implements MarshallableMessage {
     /** */
     private static final byte REBALANCED_FLAG_MASK = 0x01;
 
@@ -99,10 +101,10 @@ public class GridDhtPartitionsFullMessage extends 
GridDhtPartitionsAbstractMessa
      * Used as a stub for serialization of {@link #errs}.
      * All logic resides within getter and setter.
      */
-    @Order(value = 7, method = "errorMessages")
+    @Order(7)
     @Compress
     @SuppressWarnings("unused")
-    private Map<UUID, ErrorMessage> errMsgs;
+    Map<UUID, ErrorMessage> errMsgs;
 
     /** */
     @Order(8)
@@ -367,20 +369,6 @@ public class GridDhtPartitionsFullMessage extends 
GridDhtPartitionsAbstractMessa
         this.errs = new HashMap<>(errs);
     }
 
-    /**
-     * @return Error messages map.
-     */
-    public Map<UUID, ErrorMessage> errorMessages() {
-        return errs == null ? null : F.viewReadOnly(errs, ErrorMessage::new);
-    }
-
-    /**
-     * @param errMsgs Error messages map.
-     */
-    public void errorMessages(Map<UUID, ErrorMessage> errMsgs) {
-        errs = errMsgs == null ? null : F.viewReadOnly(errMsgs, e -> 
e.error());
-    }
-
     /**
      * Rebalance finished.
      */
@@ -531,4 +519,14 @@ public class GridDhtPartitionsFullMessage extends 
GridDhtPartitionsAbstractMessa
 
         return map;
     }
+
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
+        errMsgs = errs == null ? null : F.viewReadOnly(errs, 
ErrorMessage::new);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader 
clsLdr) throws IgniteCheckedException {
+        errs = errMsgs == null ? null : F.viewReadOnly(errMsgs, e -> 
e.error());
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/IgniteDhtDemandedPartitionsMap.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/IgniteDhtDemandedPartitionsMap.java
index e521edafcf1..3c718f58c3c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/IgniteDhtDemandedPartitionsMap.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/IgniteDhtDemandedPartitionsMap.java
@@ -41,11 +41,11 @@ public class IgniteDhtDemandedPartitionsMap implements 
Serializable, Message {
     private static final long serialVersionUID = 0L;
 
     /** Map of partitions that will be preloaded from history. (partId -> 
(fromCntr, toCntr)). */
-    @Order(value = 0, method = "historicalMap")
+    @Order(0)
     CachePartitionPartialCountersMap historical;
 
     /** Set of partitions that require full rebalancing. */
-    @Order(value = 1, method = "fullSet")
+    @Order(1)
     @GridToStringInclude
     Set<Integer> full;
 
@@ -151,11 +151,6 @@ public class IgniteDhtDemandedPartitionsMap implements 
Serializable, Message {
         return historical;
     }
 
-    /** */
-    public void historicalMap(CachePartitionPartialCountersMap historical) {
-        this.historical = historical;
-    }
-
     /** */
     public Set<Integer> fullSet() {
         if (full == null)
@@ -164,11 +159,6 @@ public class IgniteDhtDemandedPartitionsMap implements 
Serializable, Message {
         return Collections.unmodifiableSet(full);
     }
 
-    /** */
-    public void fullSet(Set<Integer> full) {
-        this.full = full;
-    }
-
     /** */
     public Set<Integer> historicalSet() {
         if (historical == null)
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java
index 937abedccd2..0fec84749f5 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java
@@ -55,7 +55,7 @@ public class GridNearGetResponse extends GridCacheIdMessage 
implements GridCache
 
     /** Result. */
     @GridToStringInclude
-    @Order(value = 3, method = "entries")
+    @Order(3)
     Collection<GridCacheEntryInfo> entries;
 
     /** Keys to retry due to ownership shift. */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java
index d8d3bbc59cf..c3c73676c98 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java
@@ -50,7 +50,7 @@ public class GridNearSingleGetResponse extends 
GridCacheIdMessage implements Gri
     Message res;
 
     /** Topology version. */
-    @Order(value = 2, method = "topologyVersion")
+    @Order(2)
     AffinityTopologyVersion topVer;
 
     /** Error message. */
@@ -127,13 +127,6 @@ public class GridNearSingleGetResponse extends 
GridCacheIdMessage implements Gri
         return topVer != null ? topVer : super.topologyVersion();
     }
 
-    /**
-     * @param topVer Topology version.
-     */
-    public void topologyVersion(AffinityTopologyVersion topVer) {
-        this.topVer = topVer;
-    }
-
     /**
      * @return {@code True} if invalid partitions error occurred.
      */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java
index 9ab8a49a0ac..7e99db3bce4 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java
@@ -151,7 +151,7 @@ public class GridCacheQueryRequest extends 
GridCacheIdMessage implements GridCac
     int part = -1;
 
     /** */
-    @Order(value = 19, method = "topologyVersion")
+    @Order(19)
     AffinityTopologyVersion topVer;
 
     /** Set of keys that must be skiped during iteration. */
@@ -406,13 +406,6 @@ public class GridCacheQueryRequest extends 
GridCacheIdMessage implements GridCac
         return topVer != null ? topVer : AffinityTopologyVersion.NONE;
     }
 
-    /**
-     * @param topVer Topology version.
-     */
-    public void topologyVersion(AffinityTopologyVersion topVer) {
-        this.topVer = topVer;
-    }
-
     /** {@inheritDoc} */
     @Override public void prepareMarshal(GridCacheSharedContext<?, ?> ctx) 
throws IgniteCheckedException {
         super.prepareMarshal(ctx);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEntry.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEntry.java
index 3b7e40f84f5..85e2dc147f4 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEntry.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEntry.java
@@ -29,13 +29,14 @@ import 
org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.plugin.extensions.communication.MarshallableMessage;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Continuous query entry.
  */
-public class CacheContinuousQueryEntry implements GridCacheDeployable, Message 
{
+public class CacheContinuousQueryEntry implements GridCacheDeployable, 
MarshallableMessage {
     /** */
     private static final byte BACKUP_ENTRY = 0b0001;
 
@@ -55,19 +56,28 @@ public class CacheContinuousQueryEntry implements 
GridCacheDeployable, Message {
 
     /** Key. */
     @GridToStringInclude
-    @Order(value = 2, method = "serializedKey")
     KeyCacheObject key;
 
+    /** */
+    @Order(2)
+    byte[] keyBytes;
+
     /** New value. */
     @GridToStringInclude
-    @Order(value = 3, method = "serializedNewValue")
     CacheObject newVal;
 
+    /** */
+    @Order(3)
+    byte[] newValBytes;
+
     /** Old value. */
     @GridToStringInclude
-    @Order(value = 4, method = "serializedOldValue")
     CacheObject oldVal;
 
+    /** */
+    @Order(4)
+    byte[] oldValBytes;
+
     /** Cache name. */
     @Order(5)
     int cacheId;
@@ -325,16 +335,6 @@ public class CacheContinuousQueryEntry implements 
GridCacheDeployable, Message {
         return key;
     }
 
-    /** */
-    KeyCacheObject serializedKey() {
-        return isFiltered() ? null : key;
-    }
-
-    /** */
-    void serializedKey(KeyCacheObject key) {
-        this.key = key;
-    }
-
     /**
      * @return New value.
      */
@@ -342,16 +342,6 @@ public class CacheContinuousQueryEntry implements 
GridCacheDeployable, Message {
         return newVal;
     }
 
-    /** */
-    CacheObject serializedNewValue() {
-        return isFiltered() ? null : newVal;
-    }
-
-    /** */
-    void serializedNewValue(CacheObject newVal) {
-        this.newVal = newVal;
-    }
-
     /**
      * @return Old value.
      */
@@ -359,16 +349,6 @@ public class CacheContinuousQueryEntry implements 
GridCacheDeployable, Message {
         return oldVal;
     }
 
-    /** */
-    CacheObject serializedOldValue() {
-        return isFiltered() ? null : oldVal;
-    }
-
-    /** */
-    void serializedOldValue(CacheObject oldVal) {
-        this.oldVal = oldVal;
-    }
-
     /** {@inheritDoc} */
     @Override public void prepare(GridDeploymentInfo depInfo) {
         this.depInfo = depInfo;
@@ -388,4 +368,30 @@ public class CacheContinuousQueryEntry implements 
GridCacheDeployable, Message {
     @Override public String toString() {
         return S.toString(CacheContinuousQueryEntry.class, this);
     }
+
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
+        if (!isFiltered()) {
+            if (key != null)
+                keyBytes = marsh.marshal(key);
+
+            if (newVal != null)
+                newValBytes = marsh.marshal(newVal);
+
+            if (oldVal != null)
+                oldValBytes = marsh.marshal(oldVal);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader 
clsLdr) throws IgniteCheckedException {
+        if (keyBytes != null)
+            key = marsh.unmarshal(keyBytes, clsLdr);
+        
+        if (newValBytes != null)
+            newVal = marsh.unmarshal(newValBytes, clsLdr);
+        
+        if (oldValBytes != null)
+            oldVal = marsh.unmarshal(oldValBytes, clsLdr);
+    }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxEntryValueHolder.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxEntryValueHolder.java
index a6e33f44967..13601b32a91 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxEntryValueHolder.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxEntryValueHolder.java
@@ -40,7 +40,7 @@ import static 
org.apache.ignite.internal.processors.cache.GridCacheOperation.UPD
  */
 public class TxEntryValueHolder implements Message {
     /** Stored value. */
-    @Order(value = 0, method = "storedValue")
+    @Order(0)
     @GridToStringInclude(sensitive = true)
     @Nullable CacheObject val;
 
@@ -91,24 +91,6 @@ public class TxEntryValueHolder implements Message {
         return val;
     }
 
-    /**
-     * Used only in serializer.
-     *
-     * @return Stored value or null.
-     */
-    public @Nullable CacheObject storedValue() {
-        return hasWriteVal ? val : null;
-    }
-
-    /**
-     * Used only in serializer.
-     *
-     * @param val Stored value.
-     */
-    public void storedValue(@Nullable CacheObject val) {
-        this.val = val;
-    }
-
     /**
      * @return Cache operation.
      */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/SingleNodeMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/SingleNodeMessage.java
index b5bfe29d1dd..3457d980c47 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/SingleNodeMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/distributed/SingleNodeMessage.java
@@ -46,8 +46,8 @@ public class SingleNodeMessage<R extends Message> implements 
Message {
     int type;
 
     /** Single node response. */
-    @Order(value = 2, method = "response")
-    private Message resp;
+    @Order(value = 2)
+    Message resp;
 
     /** Error. */
     @Order(3)
@@ -93,11 +93,6 @@ public class SingleNodeMessage<R extends Message> implements 
Message {
         return (R)resp;
     }
 
-    /** @param resp Response. */
-    public void response(R resp) {
-        this.resp = resp;
-    }
-
     /** @return {@code True} if finished with error. */
     public boolean hasError() {
         return errMsg != null;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MarshallableMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MarshallableMessage.java
index f3cc81dd68e..5f2f8c41966 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MarshallableMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MarshallableMessage.java
@@ -23,15 +23,11 @@ import org.apache.ignite.marshaller.Marshaller;
 /** A {@link Message} which still requires external custom pre-marshalling and 
post-unmarshalling. */
 public interface MarshallableMessage extends Message {
     /** @param marsh External custom marshaller. */
-    public default void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
-        throw new UnsupportedOperationException();
-    }
+    public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException;
 
     /**
      * @param marsh External custom marshaller.
      * @param clsLdr External class loader to post-unmarshall.
      */
-    public default void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) 
throws IgniteCheckedException {
-        throw new UnsupportedOperationException();
-    }
+    public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws 
IgniteCheckedException;
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java
index aea469edc80..4ee318ba2f3 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java
@@ -2596,7 +2596,7 @@ class ClientImpl extends TcpDiscoveryImpl {
 
                     if (node != null && node.visible()) {
                         try {
-                            msg.finishUnmarhal(spi.marshaller(), 
U.resolveClassLoader(spi.ignite().configuration()));
+                            msg.finishUnmarshal(spi.marshaller(), 
U.resolveClassLoader(spi.ignite().configuration()));
 
                             DiscoveryCustomMessage msgObj = msg.message();
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
index 8662d940e7b..f8d28cc912f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
@@ -6083,7 +6083,7 @@ class ServerImpl extends TcpDiscoveryImpl {
                     DiscoveryCustomMessage msgObj = null;
 
                     try {
-                        msg.finishUnmarhal(spi.marshaller(), 
U.resolveClassLoader(spi.ignite().configuration()));
+                        msg.finishUnmarshal(spi.marshaller(), 
U.resolveClassLoader(spi.ignite().configuration()));
 
                         msgObj = msg.message();
                     }
@@ -6274,7 +6274,7 @@ class ServerImpl extends TcpDiscoveryImpl {
                 DiscoveryCustomMessage msgObj;
 
                 try {
-                    msg.finishUnmarhal(spi.marshaller(), 
U.resolveClassLoader(spi.ignite().configuration()));
+                    msg.finishUnmarshal(spi.marshaller(), 
U.resolveClassLoader(spi.ignite().configuration()));
 
                     msgObj = msg.message();
                 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractTraceableMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractTraceableMessage.java
index 440766b99ab..3e633f4d47b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractTraceableMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractTraceableMessage.java
@@ -18,23 +18,26 @@
 package org.apache.ignite.spi.discovery.tcp.messages;
 
 import java.util.UUID;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.managers.discovery.DiscoveryMessageFactory;
 import org.apache.ignite.internal.processors.tracing.messages.SpanContainer;
 import org.apache.ignite.internal.processors.tracing.messages.TraceableMessage;
+import org.apache.ignite.marshaller.Marshaller;
+import org.apache.ignite.plugin.extensions.communication.MarshallableMessage;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Abstract traceable message for TCP discovery.
  */
-public abstract class TcpDiscoveryAbstractTraceableMessage extends 
TcpDiscoveryAbstractMessage implements TraceableMessage {
+public abstract class TcpDiscoveryAbstractTraceableMessage extends 
TcpDiscoveryAbstractMessage
+    implements TraceableMessage, MarshallableMessage {
     /** Container. */
     private SpanContainer spanContainer = new SpanContainer();
 
     /** Serialization holder of {@link #spanContainer}'s bytes. */
-    @SuppressWarnings("unused")
-    @Order(value = 0, method = "spanBytes")
-    @Nullable byte[] spanBytesHolder;
+    @Order(0)
+    @Nullable byte[] spanContainerBytes;
 
     /**
      * Default constructor for {@link DiscoveryMessageFactory}.
@@ -74,21 +77,19 @@ public abstract class TcpDiscoveryAbstractTraceableMessage 
extends TcpDiscoveryA
         return this;
     }
 
-    /** @return {@link #spanContainer}'s bytes. */
-    public @Nullable byte[] spanBytes() {
-        return spanContainer == null ? null : 
spanContainer.serializedSpanBytes();
+    /** {@inheritDoc} */
+    @Override public SpanContainer spanContainer() {
+        return spanContainer;
     }
 
-    /** @param spanBytes {@link #spanContainer}'s bytes. */
-    public void spanBytes(@Nullable byte[] spanBytes) {
-        if (spanBytes == null)
-            return;
-
-        spanContainer.serializedSpanBytes(spanBytes);
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
+        spanContainerBytes = spanContainer == null ? null : 
spanContainer.serializedSpanBytes();
     }
 
     /** {@inheritDoc} */
-    @Override public SpanContainer spanContainer() {
-        return spanContainer;
+    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader 
clsLdr) throws IgniteCheckedException {
+        if (spanContainerBytes != null)
+            spanContainer.serializedSpanBytes(spanContainerBytes);
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryCustomEventMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryCustomEventMessage.java
index 4b860f5e962..5ac1523f0a0 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryCustomEventMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryCustomEventMessage.java
@@ -35,7 +35,7 @@ import org.jetbrains.annotations.Nullable;
  */
 @TcpDiscoveryRedirectToClient
 @TcpDiscoveryEnsureDelivery
-public class TcpDiscoveryCustomEventMessage extends 
TcpDiscoveryAbstractTraceableMessage implements Message {
+public class TcpDiscoveryCustomEventMessage extends 
TcpDiscoveryAbstractTraceableMessage {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -101,13 +101,14 @@ public class TcpDiscoveryCustomEventMessage extends 
TcpDiscoveryAbstractTraceabl
      * @param marsh Marshaller.
      */
     // TODO: Should be removed in 
https://issues.apache.org/jira/browse/IGNITE-27627
-    public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException 
{
+    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
+        super.prepareMarshal(marsh);
+
         if (msg instanceof Message)
             serMsg = (Message)msg;
         else {
-            assert msgBytes == null || msg.isMutable() : "Message bytes are 
not null for immutable message: msg =" + msg;
-
-            msgBytes = U.marshal(marsh, msg);
+            if (msg != null)
+                msgBytes = U.marshal(marsh, msg);
         }
     }
 
@@ -118,7 +119,9 @@ public class TcpDiscoveryCustomEventMessage extends 
TcpDiscoveryAbstractTraceabl
      * @param ldr Class loader.
      */
     // TODO: Should be removed in 
https://issues.apache.org/jira/browse/IGNITE-27627
-    public void finishUnmarhal(Marshaller marsh, ClassLoader ldr) throws 
IgniteCheckedException {
+    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader ldr) 
throws IgniteCheckedException {
+        super.finishUnmarshal(marsh, ldr);
+
         if (msg != null)
             return;
 
@@ -126,7 +129,8 @@ public class TcpDiscoveryCustomEventMessage extends 
TcpDiscoveryAbstractTraceabl
             msg = (DiscoveryCustomMessage)serMsg;
         else {
             try {
-                msg = U.unmarshal(marsh, msgBytes, ldr);
+                if (msgBytes != null)
+                    msg = U.unmarshal(marsh, msgBytes, ldr);
             }
             catch (IgniteCheckedException e) {
                 // Try to resurrect a message in a case of deserialization 
failure
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeFailedMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeFailedMessage.java
index 7de93d625c7..7e08ac134de 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeFailedMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeFailedMessage.java
@@ -20,7 +20,6 @@ package org.apache.ignite.spi.discovery.tcp.messages;
 import java.util.UUID;
 import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.plugin.extensions.communication.Message;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -29,7 +28,7 @@ import org.jetbrains.annotations.Nullable;
  */
 @TcpDiscoveryEnsureDelivery
 @TcpDiscoveryRedirectToClient
-public class TcpDiscoveryNodeFailedMessage extends 
TcpDiscoveryAbstractTraceableMessage implements Message {
+public class TcpDiscoveryNodeFailedMessage extends 
TcpDiscoveryAbstractTraceableMessage {
     /** */
     private static final long serialVersionUID = 0L;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeLeftMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeLeftMessage.java
index 8e70196ab05..c307c5c3cc5 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeLeftMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeLeftMessage.java
@@ -20,7 +20,6 @@ package org.apache.ignite.spi.discovery.tcp.messages;
 import java.util.UUID;
 import org.apache.ignite.internal.managers.discovery.DiscoveryMessageFactory;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.plugin.extensions.communication.Message;
 
 /**
  * Sent by node that is stopping to coordinator across the ring,
@@ -28,7 +27,7 @@ import 
org.apache.ignite.plugin.extensions.communication.Message;
  */
 @TcpDiscoveryEnsureDelivery
 @TcpDiscoveryRedirectToClient
-public class TcpDiscoveryNodeLeftMessage extends 
TcpDiscoveryAbstractTraceableMessage implements Message {
+public class TcpDiscoveryNodeLeftMessage extends 
TcpDiscoveryAbstractTraceableMessage {
     /** */
     private static final long serialVersionUID = 0L;
 
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties 
b/modules/core/src/main/resources/META-INF/classnames.properties
index cb6e27862f6..f97c0ff4698 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -1172,7 +1172,6 @@ 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPar
 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemander$RebalanceFutureState
 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionExchangeId
 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap
-org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap
 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage
 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsAbstractMessage
 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$2
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java
index 6697942a1dc..f56dddb7dae 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java
@@ -17,11 +17,14 @@
 
 package org.apache.ignite.internal.managers.communication;
 
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.processors.cache.CacheEntryPredicateAdapter;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.junit.Test;
 
+import static org.apache.ignite.marshaller.Marshallers.jdk;
 import static 
org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
@@ -32,56 +35,88 @@ public class CacheEntryPredicateAdapterMessageTest {
     /** */
     @Test
     public void testCacheEntryPredicateAdapterCode() {
-        assertEquals(0, new CacheEntryPredicateAdapter().code());
-        assertEquals(0, new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.OTHER).code());
-        assertEquals(1, new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.VALUE).code());
-        assertEquals(1, new 
CacheEntryPredicateAdapter((CacheObject)null).code());
-        assertEquals(2, new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.HAS_VALUE).code());
-        assertEquals(3, new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.HAS_NO_VALUE).code());
-        assertEquals(4, new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.ALWAYS_FALSE).code());
+        assertEquals(0, prepare(new CacheEntryPredicateAdapter()));
+        assertEquals(0, prepare(new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.OTHER)));
+        assertEquals(1, prepare(new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.VALUE)));
+        assertEquals(1, prepare(new 
CacheEntryPredicateAdapter((CacheObject)null)));
+        assertEquals(2, prepare(new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.HAS_VALUE)));
+        assertEquals(3, prepare(new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.HAS_NO_VALUE)));
+        assertEquals(4, prepare(new 
CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.ALWAYS_FALSE)));
 
         for (CacheEntryPredicateAdapter.PredicateType t : 
CacheEntryPredicateAdapter.PredicateType.values()) {
-            assertTrue(new CacheEntryPredicateAdapter(t).code() >= 0);
-            assertTrue(new CacheEntryPredicateAdapter(t).code() < 5);
+            assertTrue(prepare(new CacheEntryPredicateAdapter(t)) >= 0);
+            assertTrue(prepare(new CacheEntryPredicateAdapter(t)) < 5);
         }
     }
 
+    /** */
+    byte prepare(CacheEntryPredicateAdapter msg) {
+        try {
+            msg.prepareMarshal(jdk());
+        }
+        catch (IgniteCheckedException e) {
+            throw new RuntimeException(e);
+        }
+
+        return msg.code();
+    }
+
     /** */
     @Test
-    public void testCacheEntryPredicateAdapterFromCode() {
+    public void testCacheEntryPredicateAdapterFromCode() throws 
IgniteCheckedException {
         CacheEntryPredicateAdapter msg = new 
CacheEntryPredicateAdapter((CacheObject)null);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(CacheEntryPredicateAdapter.PredicateType.VALUE, msg.type());
 
         msg.code((byte)0);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(CacheEntryPredicateAdapter.PredicateType.OTHER, msg.type());
 
         msg.code((byte)1);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(CacheEntryPredicateAdapter.PredicateType.VALUE, msg.type());
 
         msg.code((byte)2);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(CacheEntryPredicateAdapter.PredicateType.HAS_VALUE, 
msg.type());
 
         msg.code((byte)3);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(CacheEntryPredicateAdapter.PredicateType.HAS_NO_VALUE, 
msg.type());
 
         msg.code((byte)4);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(CacheEntryPredicateAdapter.PredicateType.ALWAYS_FALSE, 
msg.type());
 
-        Throwable t = assertThrowsWithCause(() -> msg.code((byte)5), 
IllegalArgumentException.class);
+        Throwable t = assertThrowsWithCause(() -> {
+            msg.code((byte)5);
+
+            try {
+                msg.finishUnmarshal(jdk(), U.gridClassLoader());
+            }
+            catch (IgniteCheckedException e) {
+                throw new RuntimeException(e);
+            }
+        }, IllegalArgumentException.class);
         assertEquals("Unknown cache entry predicate type code: 5", 
t.getMessage());
     }
 
     /** */
     @Test
-    public void testConversionConsistency() {
+    public void testConversionConsistency() throws IgniteCheckedException {
         for (CacheEntryPredicateAdapter.PredicateType t : 
F.concat(CacheEntryPredicateAdapter.PredicateType.values())) {
             CacheEntryPredicateAdapter msg = new CacheEntryPredicateAdapter(t);
 
             assertEquals(t, msg.type());
 
             CacheEntryPredicateAdapter newMsg = new 
CacheEntryPredicateAdapter();
+
+            msg.prepareMarshal(jdk());
+
             newMsg.code(msg.code());
 
+            newMsg.finishUnmarshal(jdk(), U.gridClassLoader());
+
             assertEquals(msg.type(), newMsg.type());
         }
     }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java
index 642615c06d3..4264d2772f8 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java
@@ -17,11 +17,14 @@
 
 package org.apache.ignite.internal.managers.communication;
 
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.cache.query.index.IndexKeyTypeMessage;
 import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyType;
 import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.junit.Test;
 
+import static org.apache.ignite.marshaller.Marshallers.jdk;
 import static 
org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -33,132 +36,193 @@ public class IndexKeyTypeMessageTest {
     /** */
     @Test
     public void testIndexKeyTypeCode() {
-        assertEquals(Byte.MIN_VALUE, new IndexKeyTypeMessage(null).code());
-        assertEquals(-1, new IndexKeyTypeMessage(IndexKeyType.UNKNOWN).code());
-        assertEquals(0, new IndexKeyTypeMessage(IndexKeyType.NULL).code());
-        assertEquals(1, new IndexKeyTypeMessage(IndexKeyType.BOOLEAN).code());
-        assertEquals(2, new IndexKeyTypeMessage(IndexKeyType.BYTE).code());
-        assertEquals(3, new IndexKeyTypeMessage(IndexKeyType.SHORT).code());
-        assertEquals(4, new IndexKeyTypeMessage(IndexKeyType.INT).code());
-        assertEquals(5, new IndexKeyTypeMessage(IndexKeyType.LONG).code());
-        assertEquals(6, new IndexKeyTypeMessage(IndexKeyType.DECIMAL).code());
-        assertEquals(7, new IndexKeyTypeMessage(IndexKeyType.DOUBLE).code());
-        assertEquals(8, new IndexKeyTypeMessage(IndexKeyType.FLOAT).code());
-        assertEquals(9, new IndexKeyTypeMessage(IndexKeyType.TIME).code());
-        assertEquals(10, new IndexKeyTypeMessage(IndexKeyType.DATE).code());
-        assertEquals(11, new 
IndexKeyTypeMessage(IndexKeyType.TIMESTAMP).code());
-        assertEquals(12, new IndexKeyTypeMessage(IndexKeyType.BYTES).code());
-        assertEquals(13, new IndexKeyTypeMessage(IndexKeyType.STRING).code());
-        assertEquals(14, new 
IndexKeyTypeMessage(IndexKeyType.STRING_IGNORECASE).code());
-        assertEquals(15, new IndexKeyTypeMessage(IndexKeyType.BLOB).code());
-        assertEquals(16, new IndexKeyTypeMessage(IndexKeyType.CLOB).code());
-        assertEquals(17, new IndexKeyTypeMessage(IndexKeyType.ARRAY).code());
-        assertEquals(18, new 
IndexKeyTypeMessage(IndexKeyType.RESULT_SET).code());
-        assertEquals(19, new 
IndexKeyTypeMessage(IndexKeyType.JAVA_OBJECT).code());
-        assertEquals(20, new IndexKeyTypeMessage(IndexKeyType.UUID).code());
-        assertEquals(21, new 
IndexKeyTypeMessage(IndexKeyType.STRING_FIXED).code());
-        assertEquals(22, new 
IndexKeyTypeMessage(IndexKeyType.GEOMETRY).code());
-        assertEquals(24, new 
IndexKeyTypeMessage(IndexKeyType.TIMESTAMP_TZ).code());
-        assertEquals(25, new IndexKeyTypeMessage(IndexKeyType.ENUM).code());
+        assertEquals(Byte.MIN_VALUE, prepare(new IndexKeyTypeMessage(null)));
+        assertEquals(-1, prepare(new 
IndexKeyTypeMessage(IndexKeyType.UNKNOWN)));
+        assertEquals(0, prepare(new IndexKeyTypeMessage(IndexKeyType.NULL)));
+        assertEquals(1, prepare(new 
IndexKeyTypeMessage(IndexKeyType.BOOLEAN)));
+        assertEquals(2, prepare(new IndexKeyTypeMessage(IndexKeyType.BYTE)));
+        assertEquals(3, prepare(new IndexKeyTypeMessage(IndexKeyType.SHORT)));
+        assertEquals(4, prepare(new IndexKeyTypeMessage(IndexKeyType.INT)));
+        assertEquals(5, prepare(new IndexKeyTypeMessage(IndexKeyType.LONG)));
+        assertEquals(6, prepare(new 
IndexKeyTypeMessage(IndexKeyType.DECIMAL)));
+        assertEquals(7, prepare(new IndexKeyTypeMessage(IndexKeyType.DOUBLE)));
+        assertEquals(8, prepare(new IndexKeyTypeMessage(IndexKeyType.FLOAT)));
+        assertEquals(9, prepare(new IndexKeyTypeMessage(IndexKeyType.TIME)));
+        assertEquals(10, prepare(new IndexKeyTypeMessage(IndexKeyType.DATE)));
+        assertEquals(11, prepare(new 
IndexKeyTypeMessage(IndexKeyType.TIMESTAMP)));
+        assertEquals(12, prepare(new IndexKeyTypeMessage(IndexKeyType.BYTES)));
+        assertEquals(13, prepare(new 
IndexKeyTypeMessage(IndexKeyType.STRING)));
+        assertEquals(14, prepare(new 
IndexKeyTypeMessage(IndexKeyType.STRING_IGNORECASE)));
+        assertEquals(15, prepare(new IndexKeyTypeMessage(IndexKeyType.BLOB)));
+        assertEquals(16, prepare(new IndexKeyTypeMessage(IndexKeyType.CLOB)));
+        assertEquals(17, prepare(new IndexKeyTypeMessage(IndexKeyType.ARRAY)));
+        assertEquals(18, prepare(new 
IndexKeyTypeMessage(IndexKeyType.RESULT_SET)));
+        assertEquals(19, prepare(new 
IndexKeyTypeMessage(IndexKeyType.JAVA_OBJECT)));
+        assertEquals(20, prepare(new IndexKeyTypeMessage(IndexKeyType.UUID)));
+        assertEquals(21, prepare(new 
IndexKeyTypeMessage(IndexKeyType.STRING_FIXED)));
+        assertEquals(22, prepare(new 
IndexKeyTypeMessage(IndexKeyType.GEOMETRY)));
+        assertEquals(24, prepare(new 
IndexKeyTypeMessage(IndexKeyType.TIMESTAMP_TZ)));
+        assertEquals(25, prepare(new IndexKeyTypeMessage(IndexKeyType.ENUM)));
 
         for (IndexKeyType keyType : IndexKeyType.values())
-            assertTrue(new IndexKeyTypeMessage(keyType).code() != 
IndexKeyTypeMessage.NULL_VALUE_CODE);
+            assertTrue(prepare(new IndexKeyTypeMessage(keyType)) != 
IndexKeyTypeMessage.NULL_VALUE_CODE);
+    }
+
+    /** */
+    byte prepare(IndexKeyTypeMessage msg) {
+        try {
+            msg.prepareMarshal(jdk());
+        }
+        catch (IgniteCheckedException e) {
+            throw new RuntimeException(e);
+        }
+
+        return msg.code();
     }
 
     /** */
     @Test
-    public void testIndexKeyTypeFromCode() {
+    public void testIndexKeyTypeFromCode() throws IgniteCheckedException {
         IndexKeyTypeMessage msg = new IndexKeyTypeMessage(null);
 
         msg.code(IndexKeyTypeMessage.NULL_VALUE_CODE);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertNull(msg.value());
 
         msg.code((byte)-1);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.UNKNOWN, msg.value());
 
         msg.code((byte)0);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.NULL, msg.value());
 
         msg.code((byte)1);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.BOOLEAN, msg.value());
 
         msg.code((byte)2);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.BYTE, msg.value());
 
         msg.code((byte)3);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.SHORT, msg.value());
 
         msg.code((byte)4);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.INT, msg.value());
 
         msg.code((byte)5);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.LONG, msg.value());
 
         msg.code((byte)6);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.DECIMAL, msg.value());
 
         msg.code((byte)7);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.DOUBLE, msg.value());
 
         msg.code((byte)8);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.FLOAT, msg.value());
 
         msg.code((byte)9);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.TIME, msg.value());
 
         msg.code((byte)10);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.DATE, msg.value());
 
         msg.code((byte)11);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.TIMESTAMP, msg.value());
 
         msg.code((byte)12);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.BYTES, msg.value());
 
         msg.code((byte)13);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.STRING, msg.value());
 
         msg.code((byte)14);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.STRING_IGNORECASE, msg.value());
 
         msg.code((byte)15);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.BLOB, msg.value());
 
         msg.code((byte)16);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.CLOB, msg.value());
 
         msg.code((byte)17);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.ARRAY, msg.value());
 
         msg.code((byte)18);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.RESULT_SET, msg.value());
 
         msg.code((byte)19);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.JAVA_OBJECT, msg.value());
 
         msg.code((byte)20);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.UUID, msg.value());
 
         msg.code((byte)21);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.STRING_FIXED, msg.value());
 
         msg.code((byte)22);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.GEOMETRY, msg.value());
 
         msg.code((byte)24);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.TIMESTAMP_TZ, msg.value());
 
         msg.code((byte)25);
+        msg.finishUnmarshal(jdk(), U.gridClassLoader());
         assertSame(IndexKeyType.ENUM, msg.value());
 
-        Throwable t = assertThrowsWithCause(() -> msg.code((byte)23), 
IllegalArgumentException.class);
+        Throwable t = assertThrowsWithCause(
+            () -> {
+                msg.code((byte)23);
+
+                try {
+                    msg.finishUnmarshal(jdk(), U.gridClassLoader());
+                }
+                catch (IgniteCheckedException e) {
+                    throw new RuntimeException(e);
+                }
+            },
+            IllegalArgumentException.class);
 
         assertEquals("Unknown index key type code: " + 23, t.getMessage());
 
         for (byte c = 26; c >= 26 && c <= Byte.MAX_VALUE; ++c) {
             byte c0 = c;
 
-            t = assertThrowsWithCause(() -> msg.code(c0), 
IllegalArgumentException.class);
+            t = assertThrowsWithCause(
+                () -> {
+                    msg.code(c0);
+
+                    try {
+                        msg.finishUnmarshal(jdk(), U.gridClassLoader());
+                    }
+                    catch (IgniteCheckedException e) {
+                        throw new RuntimeException(e);
+                    }
+                },
+                IllegalArgumentException.class);
 
             assertEquals("Unknown index key type code: " + c0, t.getMessage());
         }
@@ -166,7 +230,17 @@ public class IndexKeyTypeMessageTest {
         for (byte c = (byte)(IndexKeyTypeMessage.NULL_VALUE_CODE + 1); c < -1; 
++c) {
             byte c0 = c;
 
-            t = assertThrowsWithCause(() -> msg.code(c0), 
IllegalArgumentException.class);
+            t = assertThrowsWithCause(
+                () -> {
+                    msg.code(c0);
+
+                    try {
+                        msg.finishUnmarshal(jdk(), U.gridClassLoader());
+                    }
+                    catch (IgniteCheckedException e) {
+                        throw new RuntimeException(e);
+                    }
+                }, IllegalArgumentException.class);
 
             assertEquals("Unknown index key type code: " + c0, t.getMessage());
         }
@@ -174,15 +248,20 @@ public class IndexKeyTypeMessageTest {
 
     /** */
     @Test
-    public void testConversionConsistency() {
+    public void testConversionConsistency() throws IgniteCheckedException {
         for (IndexKeyType keyType : F.concat(IndexKeyType.values(), 
(IndexKeyType)null)) {
             IndexKeyTypeMessage msg = new IndexKeyTypeMessage(keyType);
 
             assertEquals(keyType, msg.value());
 
             IndexKeyTypeMessage newMsg = new IndexKeyTypeMessage();
+
+            msg.prepareMarshal(jdk());
+
             newMsg.code(msg.code());
 
+            newMsg.finishUnmarshal(jdk(), U.gridClassLoader());
+
             assertEquals(msg.value(), newMsg.value());
         }
     }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClientSlowDiscoveryAbstractTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClientSlowDiscoveryAbstractTest.java
index d81ef052420..fd6c6f9e4be 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClientSlowDiscoveryAbstractTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClientSlowDiscoveryAbstractTest.java
@@ -93,7 +93,7 @@ abstract class ClientSlowDiscoveryAbstractTest extends 
GridCommonAbstractTest {
             TcpDiscoveryCustomEventMessage cm = 
(TcpDiscoveryCustomEventMessage)msg;
 
             try {
-                cm.finishUnmarhal(marshaller(), 
U.resolveClassLoader(ignite().configuration()));
+                cm.finishUnmarshal(marshaller(), 
U.resolveClassLoader(ignite().configuration()));
 
                 assertNotNull(cm.message());
             }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteMarshallerCacheClientRequestsMappingTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteMarshallerCacheClientRequestsMappingTest.java
index 658c56872e6..fe4a0eeb708 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteMarshallerCacheClientRequestsMappingTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteMarshallerCacheClientRequestsMappingTest.java
@@ -163,7 +163,7 @@ public class IgniteMarshallerCacheClientRequestsMappingTest 
extends GridCommonAb
                         try {
                             TcpDiscoveryCustomEventMessage evtMsg = 
(TcpDiscoveryCustomEventMessage)msg;
 
-                            evtMsg.finishUnmarhal(marshaller(), 
U.gridClassLoader());
+                            evtMsg.finishUnmarshal(marshaller(), 
U.gridClassLoader());
 
                             DiscoveryCustomMessage delegate = 
U.unwrapCustomMessage(evtMsg.message());
 
@@ -239,7 +239,7 @@ public class IgniteMarshallerCacheClientRequestsMappingTest 
extends GridCommonAb
                         try {
                             TcpDiscoveryCustomEventMessage evtMsg = 
(TcpDiscoveryCustomEventMessage)msg;
 
-                            evtMsg.finishUnmarhal(marshaller(), 
U.gridClassLoader());
+                            evtMsg.finishUnmarshal(marshaller(), 
U.gridClassLoader());
 
                             DiscoveryCustomMessage delegate = 
U.unwrapCustomMessage(evtMsg.message());
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteSequentialNodeCrashRecoveryTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteSequentialNodeCrashRecoveryTest.java
index cf36782a8ed..b6162d71da1 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteSequentialNodeCrashRecoveryTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteSequentialNodeCrashRecoveryTest.java
@@ -357,7 +357,7 @@ public class IgniteSequentialNodeCrashRecoveryTest extends 
GridCommonAbstractTes
             DiscoveryCustomMessage msgObj = null;
 
             try {
-                msg.finishUnmarhal(marshaller(), U.gridClassLoader());
+                msg.finishUnmarshal(marshaller(), U.gridClassLoader());
 
                 msgObj = msg.message();
             }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotJoiningClientTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotJoiningClientTest.java
index 6e5f536f9de..fd42dc16fbf 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotJoiningClientTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotJoiningClientTest.java
@@ -246,7 +246,7 @@ public class IncrementalSnapshotJoiningClientTest extends 
AbstractIncrementalSna
                 TcpDiscoveryCustomEventMessage m = 
(TcpDiscoveryCustomEventMessage)msg;
 
                 try {
-                    m.finishUnmarhal(marshaller(), 
U.resolveClassLoader(ignite().configuration()));
+                    m.finishUnmarshal(marshaller(), 
U.resolveClassLoader(ignite().configuration()));
 
                     if (U.unwrapCustomMessage(m.message()) instanceof 
InitMessage)
                         rcvStartSnpReq.countDown();
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/query/schema/IndexWithSameNameTestBase.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/query/schema/IndexWithSameNameTestBase.java
index 7fd83a98ef7..e37cee61fc5 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/query/schema/IndexWithSameNameTestBase.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/query/schema/IndexWithSameNameTestBase.java
@@ -313,7 +313,7 @@ public abstract class IndexWithSameNameTestBase extends 
GridCommonAbstractTest {
                 try {
                     TcpDiscoveryCustomEventMessage evtMsg = 
(TcpDiscoveryCustomEventMessage)msg;
 
-                    evtMsg.finishUnmarhal(marshaller(), U.gridClassLoader());
+                    evtMsg.finishUnmarshal(marshaller(), U.gridClassLoader());
 
                     DiscoveryCustomMessage discoCustomMsg = 
U.unwrapCustomMessage(evtMsg.message());
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/BlockTcpDiscoverySpi.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/BlockTcpDiscoverySpi.java
index 020d5f78f23..00ed5f205ab 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/BlockTcpDiscoverySpi.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/BlockTcpDiscoverySpi.java
@@ -54,7 +54,7 @@ public class BlockTcpDiscoverySpi extends TestTcpDiscoverySpi 
{
         TcpDiscoveryCustomEventMessage cm = 
(TcpDiscoveryCustomEventMessage)msg;
 
         try {
-            cm.finishUnmarhal(marshaller(), U.gridClassLoader());
+            cm.finishUnmarshal(marshaller(), U.gridClassLoader());
 
             assertNotNull(cm.message());
         }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java
index 24559bdb1f6..95494a0bcdb 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySelfTest.java
@@ -2609,7 +2609,7 @@ public class TcpDiscoverySelfTest extends 
GridCommonAbstractTest {
                     try {
                         TcpDiscoveryCustomEventMessage evtMsg = 
(TcpDiscoveryCustomEventMessage)msg;
 
-                        evtMsg.finishUnmarhal(marshaller(), 
U.gridClassLoader());
+                        evtMsg.finishUnmarshal(marshaller(), 
U.gridClassLoader());
 
                         DiscoveryCustomMessage custMsg = 
U.unwrapCustomMessage(evtMsg.message());
 
diff --git 
a/modules/core/src/test/resources/codegen/TestMarshallableMessageMarshallableSerializer.java
 
b/modules/core/src/test/resources/codegen/TestMarshallableMessageMarshallableSerializer.java
index 80602f050ee..97aef08f2f0 100644
--- 
a/modules/core/src/test/resources/codegen/TestMarshallableMessageMarshallableSerializer.java
+++ 
b/modules/core/src/test/resources/codegen/TestMarshallableMessageMarshallableSerializer.java
@@ -51,7 +51,7 @@ public class TestMarshallableMessageMarshallableSerializer 
implements MessageSer
                 msg.prepareMarshal(marshaller);
             }
             catch (IgniteCheckedException e) {
-                throw new IgniteException("Failed to marshal object", e);
+                throw new IgniteException("Failed to marshal object" + 
msg.getClass().getSimpleName(), e);
             }
 
             writer.onHeaderWritten();
@@ -112,7 +112,7 @@ public class TestMarshallableMessageMarshallableSerializer 
implements MessageSer
             msg.finishUnmarshal(marshaller, clsLdr);
         }
         catch (IgniteCheckedException e) {
-            throw new IgniteException("Failed to unmarshal object", e);
+            throw new IgniteException("Failed to unmarshal object" + 
msg.getClass().getSimpleName(), e);
         }
 
         return true;
diff --git a/modules/core/src/test/resources/codegen/TestMessage.java 
b/modules/core/src/test/resources/codegen/TestMessage.java
index 3e9812f905d..6f3ef5eb135 100644
--- a/modules/core/src/test/resources/codegen/TestMessage.java
+++ b/modules/core/src/test/resources/codegen/TestMessage.java
@@ -62,8 +62,8 @@ public class TestMessage implements Message {
     @Order(10)
     BitSet bitSet;
 
-    @Order(value = 11, method = "overridenFieldMethod")
-    private String field;
+    @Order(value = 11)
+    String field;
 
     @Order(12)
     KeyCacheObject keyCacheObject;
diff --git a/modules/core/src/test/resources/codegen/TestMessageSerializer.java 
b/modules/core/src/test/resources/codegen/TestMessageSerializer.java
index 130b838a6da..825928b57d3 100644
--- a/modules/core/src/test/resources/codegen/TestMessageSerializer.java
+++ b/modules/core/src/test/resources/codegen/TestMessageSerializer.java
@@ -116,7 +116,7 @@ public class TestMessageSerializer implements 
MessageSerializer<TestMessage> {
                 writer.incrementState();
 
             case 11:
-                if (!writer.writeString(msg.overridenFieldMethod()))
+                if (!writer.writeString(msg.field))
                     return false;
 
                 writer.incrementState();
@@ -235,7 +235,7 @@ public class TestMessageSerializer implements 
MessageSerializer<TestMessage> {
                 reader.incrementState();
 
             case 11:
-                msg.overridenFieldMethod(reader.readString());
+                msg.field = reader.readString();
 
                 if (!reader.isLastRead())
                     return false;

Reply via email to