IGNITE-19452 Forbid placing Marshallable on some standard types (#2135)

diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index e64c4ce..dc1ec81 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -12,8 +12,8 @@
     <inspection_tool class="AccessToStaticFieldLockedOnInstance" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="ignoredClasses">
         <set>
-          <option value="org.apache.ignite.lang.ByteArray" />
           <option value="org.apache.ignite.internal.logger.IgniteLogger" />
+          <option value="org.apache.ignite.lang.ByteArray" />
         </set>
       </option>
     </inspection_tool>
@@ -488,7 +488,6 @@
     <inspection_tool class="CloneCallsConstructors" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="CloneInNonCloneableClass" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="CloneReturnsClassType" enabled="true" level="WARNING" enabled_by_default="true" />
-    <inspection_tool class="CollectionContainsUrl" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="CollectionsFieldAccessReplaceableByMethodCall" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="CommentAbsent" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="CommentedOutCode" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
@@ -512,11 +511,18 @@
       <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="true" />
     </inspection_tool>
     <inspection_tool class="ConstantMathCall" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="ConstantValue" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="true" />
+    </inspection_tool>
     <inspection_tool class="ConstantValueVariableUse" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="ContinueStatementWithLabel" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="CovariantCompareTo" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="CovariantEquals" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="DanglingJavadoc" enabled="false" level="WARNING" enabled_by_default="false" />
+    <inspection_tool class="DataFlowIssue" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="SUGGEST_NULLABLE_ANNOTATIONS" value="true" />
+      <option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="false" />
+    </inspection_tool>
     <inspection_tool class="DataProviderReturnType" enabled="false" level="ERROR" enabled_by_default="false" />
     <inspection_tool class="DefaultNotLastCaseInSwitch" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="DelegatesTo" enabled="false" level="WARNING" enabled_by_default="false" />
@@ -543,8 +549,10 @@
     <inspection_tool class="EnumerationCanBeIteration" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="EqualsAndHashcode" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="EqualsCalledOnEnumConstant" enabled="true" level="WARNING" enabled_by_default="true" />
-    <inspection_tool class="EqualsHashCodeCalledOnUrl" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="EqualsReplaceableByObjectsCall" enabled="true" level="INFORMATION" enabled_by_default="true" />
+    <inspection_tool class="EqualsWithItself" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ignoreNonFinalClassesInTest" value="true" />
+    </inspection_tool>
     <inspection_tool class="ExceptionFromCatchWhichDoesntWrap" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="ignoreGetMessage" value="true" />
       <option name="ignoreCantWrap" value="true" />
@@ -933,7 +941,6 @@
     <inspection_tool class="RedundantImport" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="RedundantInnerClassModifier" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="RedundantLabelMigration" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
-    <inspection_tool class="RedundantMethodOverride" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="RedundantNotNullExtensionReceiverOfInline" enabled="true" level="INFORMATION" enabled_by_default="true" />
     <inspection_tool class="RedundantObjectTypeCheck" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
     <inspection_tool class="RedundantStringOperation" enabled="false" level="WARNING" enabled_by_default="false" />
@@ -1032,13 +1039,11 @@
       </option>
     </inspection_tool>
     <inspection_tool class="SuspiciousArrayCast" enabled="true" level="WARNING" enabled_by_default="true" />
-    <inspection_tool class="SuspiciousIndentAfterControlStatement" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="SuspiciousLiteralUnderscore" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="SuspiciousLocalesLanguages" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="SwitchStatementDensity" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="m_limit" value="20" />
     </inspection_tool>
-    <inspection_tool class="SwitchStatementWithConfusingDeclaration" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="SynchronizationOnStaticField" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="SynchronizeOnLock" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="SynchronizedOnLiteralObject" enabled="true" level="WARNING" enabled_by_default="true" />
@@ -1070,7 +1075,6 @@
     </inspection_tool>
     <inspection_tool class="TransientFieldInNonSerializableClass" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="TransientFieldNotInitialized" enabled="true" level="WARNING" enabled_by_default="true" />
-    <inspection_tool class="TrivialStringConcatenation" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="TypeCustomizer" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="TypeParameterFindViewById" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
     <inspection_tool class="UElementAsPsi" enabled="false" level="WARNING" enabled_by_default="false" />
@@ -1172,7 +1176,7 @@
         </value>
       </option>
     </inspection_tool>
-    <inspection_tool class="unused" enabled="true" level="WARNING" enabled_by_default="true" checkParameterExcludingHierarchy="false" ignoreAccessors="true">
+    <inspection_tool class="unused" enabled="true" level="WARNING" enabled_by_default="true" ignoreAccessors="true" checkParameterExcludingHierarchy="false">
       <option name="LOCAL_VARIABLE" value="true" />
       <option name="FIELD" value="true" />
       <option name="METHOD" value="true" />
@@ -1185,4 +1189,4 @@
       <option name="ADD_NONJAVA_TO_ENTRIES" value="true" />
     </inspection_tool>
   </profile>
-</component>
+</component>
\ No newline at end of file
diff --git a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MarshallableTypesBlackList.java b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MarshallableTypesBlackList.java
new file mode 100644
index 0000000..a976b14
--- /dev/null
+++ b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MarshallableTypesBlackList.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.network.processor.messages;
+
+import java.nio.ByteBuffer;
+import java.util.BitSet;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import javax.lang.model.type.ArrayType;
+import javax.lang.model.type.DeclaredType;
+import javax.lang.model.type.TypeMirror;
+import javax.lang.model.util.SimpleTypeVisitor9;
+import org.apache.ignite.internal.network.processor.TypeUtils;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.network.NetworkMessage;
+import org.apache.ignite.network.annotations.Marshallable;
+
+/**
+ * Class for checking that a given message field can be annotated as {@link Marshallable}. A message field can be annotated as
+ * {@code Marshallable} only if it is not supported by the Direct Marshaller natively.
+ */
+public class MarshallableTypesBlackList {
+    /** Types supported by the Direct Marshaller. */
+    public static final List<Class<?>> NATIVE_TYPES = List.of(
+            // Primitive type wrappers
+            Boolean.class,
+            Byte.class,
+            Character.class,
+            Short.class,
+            Integer.class,
+            Long.class,
+            Double.class,
+            Float.class,
+            Void.class,
+
+            // Other types
+            String.class,
+            UUID.class,
+            IgniteUuid.class,
+            BitSet.class,
+            ByteBuffer.class
+    );
+
+    private static final List<Class<?>> COLLECTION_TYPES = List.of(
+            Collection.class,
+            List.class,
+            Set.class,
+            Map.class
+    );
+
+    private final TypeVisitor typeVisitor;
+
+    MarshallableTypesBlackList(TypeUtils typeUtils) {
+        this.typeVisitor = new TypeVisitor(typeUtils);
+    }
+
+    boolean canBeMarshallable(TypeMirror type) {
+        return typeVisitor.visit(type);
+    }
+
+    private static class TypeVisitor extends SimpleTypeVisitor9<Boolean, Void> {
+        private final TypeUtils typeUtils;
+
+        TypeVisitor(TypeUtils typeUtils) {
+            super(false);
+
+            this.typeUtils = typeUtils;
+        }
+
+        @Override
+        public Boolean visitArray(ArrayType t, Void unused) {
+            return visit(t.getComponentType());
+        }
+
+        @Override
+        public Boolean visitDeclared(DeclaredType t, Void unused) {
+            // Check that nested collection types are also not supported by the Direct Marshaller.
+            if (isSameType(COLLECTION_TYPES, t)) {
+                return t.getTypeArguments().stream().anyMatch(this::visit);
+            }
+
+            return !isSameType(NATIVE_TYPES, t) && !typeUtils.isSubType(t, NetworkMessage.class);
+        }
+
+        private boolean isSameType(List<Class<?>> types, DeclaredType type) {
+            return types.stream().anyMatch(cls -> typeUtils.isSameType(type, cls));
+        }
+    }
+}
diff --git a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java
index 826d988..a7693f4 100644
--- a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java
+++ b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/messages/MessageImplGenerator.java
@@ -75,6 +75,8 @@
 
     private final TypeUtils typeUtils;
 
+    private final MarshallableTypesBlackList marshallableTypesBlackList;
+
     /**
      * Constructor.
      *
@@ -85,6 +87,7 @@
         this.processingEnv = processingEnv;
         this.messageGroup = messageGroup;
         this.typeUtils = new TypeUtils(processingEnv);
+        this.marshallableTypesBlackList = new MarshallableTypesBlackList(typeUtils);
     }
 
     /**
@@ -105,8 +108,8 @@
         var fields = new ArrayList<FieldSpec>(getters.size());
         var methodImpls = new ArrayList<MethodSpec>(getters.size());
 
-        Set<String> notNullFieldNames = new HashSet<>();
-        Set<String> marshallableFieldNames = new HashSet<>();
+        var notNullFieldNames = new HashSet<String>();
+        var marshallableFieldNames = new HashSet<String>();
 
         // create a field and a getter implementation for every getter in the message interface
         for (ExecutableElement getter : getters) {
@@ -115,39 +118,38 @@
 
             String getterName = getter.getSimpleName().toString();
 
-            FieldSpec.Builder fieldBuilder = FieldSpec.builder(getterReturnType, getterName)
-                    .addAnnotation(IgniteToStringInclude.class)
-                    .addModifiers(Modifier.PRIVATE);
-
             boolean isMarshallable = getter.getAnnotation(Marshallable.class) != null;
-            boolean isNotNull = shouldRequireNotNull(getter);
-            boolean isNetworkMessage = typeUtils.isSubType(getterType, NetworkMessage.class);
 
-            if (isMarshallable && isNetworkMessage) {
-                String error =
-                        "Failed to process " + message.className() + ": " + getterName + " is both NetworkMessage and @Marshallable";
+            if (isMarshallable && !marshallableTypesBlackList.canBeMarshallable(getterType)) {
+                String error = String.format(
+                        "\"%s\" field is marked as @Marshallable but this type is supported by native serialization, "
+                                + "remove this annotation from the field",
+                        getterName
+                );
 
                 throw new ProcessingException(error);
             }
 
+            FieldSpec.Builder fieldBuilder = FieldSpec.builder(getterReturnType, getterName)
+                    .addAnnotation(IgniteToStringInclude.class)
+                    .addModifiers(Modifier.PRIVATE);
+
             boolean generateSetter = getter.getAnnotation(WithSetter.class) != null;
 
             if (!isMarshallable && !generateSetter) {
                 fieldBuilder.addModifiers(Modifier.FINAL);
             }
 
-            if (isNotNull) {
+            if (requiresNotNullCheck(getter)) {
                 notNullFieldNames.add(getterName);
             }
 
-            if (isMarshallable) {
-                marshallableFieldNames.add(getterName);
-            }
-
             FieldSpec field = fieldBuilder.build();
             fields.add(field);
 
             if (isMarshallable) {
+                marshallableFieldNames.add(getterName);
+
                 String name = getByteArrayFieldName(getterName);
                 FieldSpec marshallableFieldArray = FieldSpec.builder(BYTE_ARRAY_TYPE, name)
                         .addModifiers(Modifier.PRIVATE)
@@ -758,7 +760,7 @@
                 .build();
     }
 
-    private static boolean shouldRequireNotNull(ExecutableElement el) {
+    private static boolean requiresNotNullCheck(ExecutableElement el) {
         TypeMirror returnType = el.getReturnType();
 
         TypeKind kind = returnType.getKind();
diff --git a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/serialization/BaseMethodNameResolver.java b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/serialization/BaseMethodNameResolver.java
index 188aaa6..a9db7b7 100644
--- a/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/serialization/BaseMethodNameResolver.java
+++ b/modules/network-annotation-processor/src/main/java/org/apache/ignite/internal/network/processor/serialization/BaseMethodNameResolver.java
@@ -27,6 +27,7 @@
 import javax.annotation.processing.ProcessingEnvironment;
 import javax.lang.model.type.ArrayType;
 import javax.lang.model.type.DeclaredType;
+import javax.lang.model.type.PrimitiveType;
 import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
 import org.apache.ignite.internal.network.processor.ProcessingException;
@@ -115,10 +116,12 @@
     private String resolveReferenceMethodName(DeclaredType parameterType) {
         var typeUtils = new TypeUtils(processingEnvironment);
 
-        if (typeUtils.isSameType(parameterType, String.class)) {
+        PrimitiveType unboxedType = typeUtils.unboxedType(parameterType);
+
+        if (unboxedType != null) {
+            return "Boxed" + resolvePrimitiveMethodName(unboxedType);
+        } else if (typeUtils.isSameType(parameterType, String.class)) {
             return "String";
-        } else if (typeUtils.isSameType(parameterType, Integer.class)) {
-            return "BoxedInt";
         } else if (typeUtils.isSameType(parameterType, UUID.class)) {
             return "Uuid";
         } else if (typeUtils.isSameType(parameterType, IgniteUuid.class)) {
diff --git a/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageReader.java b/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageReader.java
index 6887f5e..279567f 100644
--- a/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageReader.java
+++ b/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageReader.java
@@ -39,21 +39,21 @@
      *
      * @param buf Byte buffer.
      */
-    public void setBuffer(ByteBuffer buf);
+    void setBuffer(ByteBuffer buf);
 
     /**
      * Sets the type of the message that is currently being read.
      *
      * @param msgCls Message type.
      */
-    public void setCurrentReadClass(Class<? extends NetworkMessage> msgCls);
+    void setCurrentReadClass(Class<? extends NetworkMessage> msgCls);
 
     /**
      * Callback that must be invoked by implementations of message serializers before they start decoding the message body.
      *
      * @return {@code True} if a read operation is allowed to proceed, {@code false} otherwise.
      */
-    public boolean beforeMessageRead();
+    boolean beforeMessageRead();
 
     /**
      * Callback that must be invoked by implementations of message serializers after they finished decoding the message body.
@@ -61,7 +61,7 @@
      * @param msgCls Class of the message that is finishing read stage.
      * @return {@code True} if a read operation can be proceeded, {@code false} otherwise.
      */
-    public boolean afterMessageRead(Class<? extends NetworkMessage> msgCls);
+    boolean afterMessageRead(Class<? extends NetworkMessage> msgCls);
 
     /**
      * Reads a {@code byte} value.
@@ -69,7 +69,15 @@
      * @param name Field name.
      * @return {@code byte} value.
      */
-    public byte readByte(String name);
+    byte readByte(String name);
+
+    /**
+     * Reads a {@code Byte} value.
+     *
+     * @param name Field name.
+     * @return {@code Byte} value.
+     */
+    @Nullable Byte readBoxedByte(String name);
 
     /**
      * Reads a {@code short} value.
@@ -77,7 +85,15 @@
      * @param name Field name.
      * @return {@code short} value.
      */
-    public short readShort(String name);
+    short readShort(String name);
+
+    /**
+     * Reads a {@code Short} value.
+     *
+     * @param name Field name.
+     * @return {@code Short} value.
+     */
+    @Nullable Short readBoxedShort(String name);
 
     /**
      * Reads an {@code int} value.
@@ -85,7 +101,7 @@
      * @param name Field name.
      * @return {@code int} value.
      */
-    public int readInt(String name);
+    int readInt(String name);
 
     /**
      * Reads an {@code int} value.
@@ -94,7 +110,7 @@
      * @param dflt A default value if the field is not found.
      * @return {@code int} value.
      */
-    public int readInt(String name, int dflt);
+    int readInt(String name, int dflt);
 
     /**
      * Reads an {@code Integer} value.
@@ -102,7 +118,7 @@
      * @param name Field name.
      * @return {@code Integer} value.
      */
-    public @Nullable Integer readBoxedInt(String name);
+    @Nullable Integer readBoxedInt(String name);
 
     /**
      * Reads a {@code long} value.
@@ -110,7 +126,15 @@
      * @param name Field name.
      * @return {@code long} value.
      */
-    public long readLong(String name);
+    long readLong(String name);
+
+    /**
+     * Reads a {@code Long} value.
+     *
+     * @param name Field name.
+     * @return {@code Long} value.
+     */
+    @Nullable Long readBoxedLong(String name);
 
     /**
      * Reads a {@code float} value.
@@ -118,7 +142,15 @@
      * @param name Field name.
      * @return {@code float} value.
      */
-    public float readFloat(String name);
+    float readFloat(String name);
+
+    /**
+     * Reads a {@code Float} value.
+     *
+     * @param name Field name.
+     * @return {@code Float} value.
+     */
+    @Nullable Float readBoxedFloat(String name);
 
     /**
      * Reads a {@code double} value.
@@ -126,7 +158,15 @@
      * @param name Field name.
      * @return {@code double} value.
      */
-    public double readDouble(String name);
+    double readDouble(String name);
+
+    /**
+     * Reads a {@code Double} value.
+     *
+     * @param name Field name.
+     * @return {@code Double} value.
+     */
+    @Nullable Double readBoxedDouble(String name);
 
     /**
      * Reads a {@code char} value.
@@ -134,7 +174,15 @@
      * @param name Field name.
      * @return {@code char} value.
      */
-    public char readChar(String name);
+    char readChar(String name);
+
+    /**
+     * Reads a {@code Character} value.
+     *
+     * @param name Field name.
+     * @return {@code Character} value.
+     */
+    @Nullable Character readBoxedChar(String name);
 
     /**
      * Reads a {@code boolean} value.
@@ -142,7 +190,15 @@
      * @param name Field name.
      * @return {@code boolean} value.
      */
-    public boolean readBoolean(String name);
+    boolean readBoolean(String name);
+
+    /**
+     * Reads a {@code Boolean} value.
+     *
+     * @param name Field name.
+     * @return {@code Boolean} value.
+     */
+    @Nullable Boolean readBoxedBoolean(String name);
 
     /**
      * Reads a {@code byte} array.
@@ -150,7 +206,7 @@
      * @param name Field name.
      * @return {@code byte} array.
      */
-    public byte[] readByteArray(String name);
+    byte[] readByteArray(String name);
 
     /**
      * Reads a {@code short} array.
@@ -158,7 +214,7 @@
      * @param name Field name.
      * @return {@code short} array.
      */
-    public short[] readShortArray(String name);
+    short[] readShortArray(String name);
 
     /**
      * Reads an {@code int} array.
@@ -166,7 +222,7 @@
      * @param name Field name.
      * @return {@code int} array.
      */
-    public int[] readIntArray(String name);
+    int[] readIntArray(String name);
 
     /**
      * Reads a {@code long} array.
@@ -174,7 +230,7 @@
      * @param name Field name.
      * @return {@code long} array.
      */
-    public long[] readLongArray(String name);
+    long[] readLongArray(String name);
 
     /**
      * Reads a {@code float} array.
@@ -182,7 +238,7 @@
      * @param name Field name.
      * @return {@code float} array.
      */
-    public float[] readFloatArray(String name);
+    float[] readFloatArray(String name);
 
     /**
      * Reads a {@code double} array.
@@ -190,7 +246,7 @@
      * @param name Field name.
      * @return {@code double} array.
      */
-    public double[] readDoubleArray(String name);
+    double[] readDoubleArray(String name);
 
     /**
      * Reads a {@code char} array.
@@ -198,7 +254,7 @@
      * @param name Field name.
      * @return {@code char} array.
      */
-    public char[] readCharArray(String name);
+    char[] readCharArray(String name);
 
     /**
      * Reads a {@code boolean} array.
@@ -206,7 +262,7 @@
      * @param name Field name.
      * @return {@code boolean} array.
      */
-    public boolean[] readBooleanArray(String name);
+    boolean[] readBooleanArray(String name);
 
     /**
      * Reads a {@link String}.
@@ -214,7 +270,7 @@
      * @param name Field name.
      * @return {@link String}.
      */
-    public String readString(String name);
+    String readString(String name);
 
     /**
      * Reads a {@link BitSet}.
@@ -222,7 +278,7 @@
      * @param name Field name.
      * @return {@link BitSet}.
      */
-    public BitSet readBitSet(String name);
+    BitSet readBitSet(String name);
 
     /**
      * Reads a {@link ByteBuffer}.
@@ -238,7 +294,7 @@
      * @param name Field name.
      * @return {@link UUID}.
      */
-    public UUID readUuid(String name);
+    UUID readUuid(String name);
 
     /**
      * Reads an {@link IgniteUuid}.
@@ -246,69 +302,69 @@
      * @param name Field name.
      * @return {@link IgniteUuid}.
      */
-    public IgniteUuid readIgniteUuid(String name);
+    IgniteUuid readIgniteUuid(String name);
 
     /**
      * Reads a nested message.
      *
-     * @param <T>  Type of a message;
+     * @param <T> Type of a message;
      * @param name Field name.
      * @return Message.
      */
-    public <T extends NetworkMessage> T readMessage(String name);
+    <T extends NetworkMessage> T readMessage(String name);
 
     /**
      * Reads an array of objects.
      *
-     * @param <T>      Type of an array.
-     * @param name     Field name.
+     * @param <T> Type of an array.
+     * @param name Field name.
      * @param itemType A component type of the array.
-     * @param itemCls  A component class of the array.
+     * @param itemCls A component class of the array.
      * @return Array of objects.
      */
-    public <T> T[] readObjectArray(String name, MessageCollectionItemType itemType, Class<T> itemCls);
+    <T> T[] readObjectArray(String name, MessageCollectionItemType itemType, Class<T> itemCls);
 
     /**
      * Reads a collection.
      *
-     * @param <C>      Type of collection.
-     * @param name     Field name.
+     * @param <C> Type of collection.
+     * @param name Field name.
      * @param itemType An item type of the collection.
      * @return Collection.
      */
-    public <C extends Collection<?>> C readCollection(String name, MessageCollectionItemType itemType);
+    <C extends Collection<?>> C readCollection(String name, MessageCollectionItemType itemType);
 
     /**
      * Reads a list.
      *
-     * @param <C>      Type of list.
-     * @param name     Field name.
+     * @param <C> Type of list.
+     * @param name Field name.
      * @param itemType An item type of the list.
      * @return List.
      */
-    public <C extends List<?>> C readList(String name, MessageCollectionItemType itemType);
+    <C extends List<?>> C readList(String name, MessageCollectionItemType itemType);
 
     /**
      * Reads a set.
      *
-     * @param <C>      Type of set.
-     * @param name     Field name.
+     * @param <C> Type of set.
+     * @param name Field name.
      * @param itemType An item type of the set.
      * @return Set.
      */
-    public <C extends Set<?>> C readSet(String name, MessageCollectionItemType itemType);
+    <C extends Set<?>> C readSet(String name, MessageCollectionItemType itemType);
 
     /**
      * Reads a map.
      *
-     * @param <M>     Type of a map.
-     * @param name    Field name.
+     * @param <M> Type of a map.
+     * @param name Field name.
      * @param keyType The type of the map's key.
      * @param valType The type of the map's value.
-     * @param linked  Whether a {@link LinkedHashMap} should be created.
+     * @param linked Whether a {@link LinkedHashMap} should be created.
      * @return Map.
      */
-    public <M extends Map<?, ?>> M readMap(String name, MessageCollectionItemType keyType,
+    <M extends Map<?, ?>> M readMap(String name, MessageCollectionItemType keyType,
             MessageCollectionItemType valType, boolean linked);
 
     /**
@@ -317,34 +373,34 @@
      *
      * @return Whether the last value was fully read.
      */
-    public boolean isLastRead();
+    boolean isLastRead();
 
     /**
      * Gets a current read state.
      *
      * @return Read state.
      */
-    public int state();
+    int state();
 
     /**
      * Increments a read state.
      */
-    public void incrementState();
+    void incrementState();
 
     /**
      * Callback called before an inner message is read.
      */
-    public void beforeInnerMessageRead();
+    void beforeInnerMessageRead();
 
     /**
      * Callback called after an inner message is read.
      *
      * @param finished Whether a message was fully read.
      */
-    public void afterInnerMessageRead(boolean finished);
+    void afterInnerMessageRead(boolean finished);
 
     /**
      * Resets this reader.
      */
-    public void reset();
+    void reset();
 }
diff --git a/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageWriter.java b/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageWriter.java
index 776b369..ec133bb 100644
--- a/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageWriter.java
+++ b/modules/network-api/src/main/java/org/apache/ignite/network/serialization/MessageWriter.java
@@ -38,216 +38,279 @@
      *
      * @param buf Byte buffer.
      */
-    public void setBuffer(ByteBuffer buf);
+    void setBuffer(ByteBuffer buf);
 
     /**
      * Sets the type of the message that is currently being written.
      *
      * @param msgCls Message type.
      */
-    public void setCurrentWriteClass(Class<? extends NetworkMessage> msgCls);
+    void setCurrentWriteClass(Class<? extends NetworkMessage> msgCls);
 
     /**
      * Writes the header of a message.
      *
-     * @param groupType   Message group type.
+     * @param groupType Message group type.
      * @param messageType Message type.
-     * @param fieldCnt    Fields count.
+     * @param fieldCnt Fields count.
      * @return {@code true} if successfully. Otherwise returns {@code false}.
      */
-    public boolean writeHeader(short groupType, short messageType, byte fieldCnt);
+    boolean writeHeader(short groupType, short messageType, byte fieldCnt);
 
     /**
      * Writes a {@code byte} value.
      *
      * @param name Field name.
-     * @param val  {@code byte} value.
+     * @param val {@code byte} value.
      * @return Whether a value was fully written.
      */
-    public boolean writeByte(String name, byte val);
+    boolean writeByte(String name, byte val);
+
+    /**
+     * Writes a {@code Byte} value.
+     *
+     * @param name Field name.
+     * @param val {@code Byte} value.
+     * @return Whether a value was fully written.
+     */
+    boolean writeBoxedByte(String name, @Nullable Byte val);
 
     /**
      * Writes a {@code short} value.
      *
      * @param name Field name.
-     * @param val  {@code short} value.
+     * @param val {@code short} value.
      * @return Whether a value was fully written.
      */
-    public boolean writeShort(String name, short val);
+    boolean writeShort(String name, short val);
+
+    /**
+     * Writes a {@code Short} value.
+     *
+     * @param name Field name.
+     * @param val {@code Short} value.
+     * @return Whether a value was fully written.
+     */
+    boolean writeBoxedShort(String name, @Nullable Short val);
 
     /**
      * Writes an {@code int} value.
      *
      * @param name Field name.
-     * @param val  {@code int} value.
+     * @param val {@code int} value.
      * @return Whether a value was fully written.
      */
-    public boolean writeInt(String name, int val);
+    boolean writeInt(String name, int val);
 
     /**
      * Writes an {@code Integer} value.
      *
      * @param name Field name.
-     * @param val  {@code Integer} value.
+     * @param val {@code Integer} value.
      * @return Whether a value was fully written.
      */
-    public boolean writeBoxedInt(String name, @Nullable Integer val);
+    boolean writeBoxedInt(String name, @Nullable Integer val);
 
     /**
      * Writes a {@code long} value.
      *
      * @param name Field name.
-     * @param val  {@code long} value.
+     * @param val {@code long} value.
      * @return Whether a value was fully written.
      */
-    public boolean writeLong(String name, long val);
+    boolean writeLong(String name, long val);
+
+    /**
+     * Writes a {@code Long} value.
+     *
+     * @param name Field name.
+     * @param val {@code Long} value.
+     * @return Whether a value was fully written.
+     */
+    boolean writeBoxedLong(String name, @Nullable Long val);
 
     /**
      * Writes a {@code float} value.
      *
      * @param name Field name.
-     * @param val  {@code float} value.
+     * @param val {@code float} value.
      * @return Whether a value was fully written.
      */
-    public boolean writeFloat(String name, float val);
+    boolean writeFloat(String name, float val);
+
+    /**
+     * Writes a {@code Float} value.
+     *
+     * @param name Field name.
+     * @param val {@code Float} value.
+     * @return Whether a value was fully written.
+     */
+    boolean writeBoxedFloat(String name, @Nullable Float val);
 
     /**
      * Writes a {@code double} value.
      *
      * @param name Field name.
-     * @param val  {@code double} value.
+     * @param val {@code double} value.
      * @return Whether a value was fully written.
      */
-    public boolean writeDouble(String name, double val);
+    boolean writeDouble(String name, double val);
+
+    /**
+     * Writes a {@code Double} value.
+     *
+     * @param name Field name.
+     * @param val {@code Short} value.
+     * @return Whether a value was fully written.
+     */
+    boolean writeBoxedDouble(String name, @Nullable Double val);
 
     /**
      * Writes a {@code char} value.
      *
      * @param name Field name.
-     * @param val  {@code char} value.
+     * @param val {@code char} value.
      * @return Whether a value was fully written.
      */
-    public boolean writeChar(String name, char val);
+    boolean writeChar(String name, char val);
+
+    /**
+     * Writes a {@code Character} value.
+     *
+     * @param name Field name.
+     * @param val {@code Character} value.
+     * @return Whether a value was fully written.
+     */
+    boolean writeBoxedChar(String name, @Nullable Character val);
 
     /**
      * Writes a {@code boolean} value.
      *
      * @param name Field name.
-     * @param val  {@code boolean} value.
+     * @param val {@code boolean} value.
      * @return Whether a value was fully written.
      */
-    public boolean writeBoolean(String name, boolean val);
+    boolean writeBoolean(String name, boolean val);
+
+    /**
+     * Writes a {@code Boolean} value.
+     *
+     * @param name Field name.
+     * @param val {@code Boolean} value.
+     * @return Whether a value was fully written.
+     */
+    boolean writeBoxedBoolean(String name, @Nullable Boolean val);
 
     /**
      * Writes a {@code byte} array.
      *
      * @param name Field name.
-     * @param val  {@code byte} array.
+     * @param val {@code byte} array.
      * @return Whether an array was fully written.
      */
-    public boolean writeByteArray(String name, byte[] val);
+    boolean writeByteArray(String name, byte[] val);
 
     /**
      * Writes a {@code byte} array.
      *
      * @param name Field name.
-     * @param val  {@code byte} array.
-     * @param off  Offset.
-     * @param len  Length.
+     * @param val {@code byte} array.
+     * @param off Offset.
+     * @param len Length.
      * @return Whether an array was fully written.
      */
-    public boolean writeByteArray(String name, byte[] val, long off, int len);
+    boolean writeByteArray(String name, byte[] val, long off, int len);
 
     /**
      * Writes a {@code short} array.
      *
      * @param name Field name.
-     * @param val  {@code short} array.
+     * @param val {@code short} array.
      * @return Whether an array was fully written.
      */
-    public boolean writeShortArray(String name, short[] val);
+    boolean writeShortArray(String name, short[] val);
 
     /**
      * Writes an {@code int} array.
      *
      * @param name Field name.
-     * @param val  {@code int} array.
+     * @param val {@code int} array.
      * @return Whether an array was fully written.
      */
-    public boolean writeIntArray(String name, int[] val);
+    boolean writeIntArray(String name, int[] val);
 
     /**
      * Writes a {@code long} array.
      *
      * @param name Field name.
-     * @param val  {@code long} array.
+     * @param val {@code long} array.
      * @return Whether an array was fully written.
      */
-    public boolean writeLongArray(String name, long[] val);
+    boolean writeLongArray(String name, long[] val);
 
     /**
      * Writes a {@code long} array.
      *
      * @param name Field name.
-     * @param val  {@code long} array.
-     * @param len  Length.
+     * @param val {@code long} array.
+     * @param len Length.
      * @return Whether an array was fully written.
      */
-    public boolean writeLongArray(String name, long[] val, int len);
+    boolean writeLongArray(String name, long[] val, int len);
 
     /**
      * Writes a {@code float} array.
      *
      * @param name Field name.
-     * @param val  {@code float} array.
+     * @param val {@code float} array.
      * @return Whether an array was fully written.
      */
-    public boolean writeFloatArray(String name, float[] val);
+    boolean writeFloatArray(String name, float[] val);
 
     /**
      * Writes a {@code double} array.
      *
      * @param name Field name.
-     * @param val  {@code double} array.
+     * @param val {@code double} array.
      * @return Whether an array was fully written.
      */
-    public boolean writeDoubleArray(String name, double[] val);
+    boolean writeDoubleArray(String name, double[] val);
 
     /**
      * Writes a {@code char} array.
      *
      * @param name Field name.
-     * @param val  {@code char} array.
+     * @param val {@code char} array.
      * @return Whether an array was fully written.
      */
-    public boolean writeCharArray(String name, char[] val);
+    boolean writeCharArray(String name, char[] val);
 
     /**
      * Writes a {@code boolean} array.
      *
      * @param name Field name.
-     * @param val  {@code boolean} array.
+     * @param val {@code boolean} array.
      * @return Whether an array was fully written.
      */
-    public boolean writeBooleanArray(String name, boolean[] val);
+    boolean writeBooleanArray(String name, boolean[] val);
 
     /**
      * Writes a {@link String}.
      *
      * @param name Field name.
-     * @param val  {@link String}.
+     * @param val {@link String}.
      * @return Whether a value was fully written.
      */
-    public boolean writeString(String name, String val);
+    boolean writeString(String name, String val);
 
     /**
      * Writes a {@link BitSet}.
      *
      * @param name Field name.
-     * @param val  {@link BitSet}.
+     * @param val {@link BitSet}.
      * @return Whether a value was fully written.
      */
-    public boolean writeBitSet(String name, BitSet val);
+    boolean writeBitSet(String name, BitSet val);
 
     /**
      * Writes a {@link ByteBuffer}.
@@ -262,85 +325,85 @@
      * Writes an {@link UUID}.
      *
      * @param name Field name.
-     * @param val  {@link UUID}.
+     * @param val {@link UUID}.
      * @return Whether a value was fully written.
      */
-    public boolean writeUuid(String name, UUID val);
+    boolean writeUuid(String name, UUID val);
 
     /**
      * Writes an {@link IgniteUuid}.
      *
      * @param name Field name.
-     * @param val  {@link IgniteUuid}.
+     * @param val {@link IgniteUuid}.
      * @return Whether a value was fully written.
      */
-    public boolean writeIgniteUuid(String name, IgniteUuid val);
+    boolean writeIgniteUuid(String name, IgniteUuid val);
 
     /**
      * Writes a nested message.
      *
      * @param name Field name.
-     * @param val  Message.
+     * @param val Message.
      * @return Whether a value was fully written.
      */
-    public boolean writeMessage(String name, NetworkMessage val);
+    boolean writeMessage(String name, NetworkMessage val);
 
     /**
      * Writes an array of objects.
      *
-     * @param <T>      Type of an array.
-     * @param name     Field name.
-     * @param arr      Array of objects.
+     * @param <T> Type of an array.
+     * @param name Field name.
+     * @param arr Array of objects.
      * @param itemType A component type of the array.
      * @return Whether an array was fully written.
      */
-    public <T> boolean writeObjectArray(String name, T[] arr, MessageCollectionItemType itemType);
+    <T> boolean writeObjectArray(String name, T[] arr, MessageCollectionItemType itemType);
 
     /**
      * Writes collection.
      *
-     * @param <T>      Type of a collection.
-     * @param name     Field name.
-     * @param col      Collection.
+     * @param <T> Type of a collection.
+     * @param name Field name.
+     * @param col Collection.
      * @param itemType An item type of the collection.
      * @return Whether a value was fully written.
      */
-    public <T> boolean writeCollection(String name, Collection<T> col, MessageCollectionItemType itemType);
+    <T> boolean writeCollection(String name, Collection<T> col, MessageCollectionItemType itemType);
 
     /**
      * Writes a list.
      *
-     * @param <T>      Type of list.
-     * @param name     Field name.
-     * @param col      Collection.
+     * @param <T> Type of list.
+     * @param name Field name.
+     * @param col Collection.
      * @param itemType An item type of the list.
      * @return Whether a value was fully written.
      */
-    public <T> boolean writeList(String name, List<T> col, MessageCollectionItemType itemType);
+    <T> boolean writeList(String name, List<T> col, MessageCollectionItemType itemType);
 
     /**
      * Writes a set.
      *
-     * @param <T>      Type of set.
-     * @param name     Field name.
-     * @param col      Collection.
+     * @param <T> Type of set.
+     * @param name Field name.
+     * @param col Collection.
      * @param itemType An item type of the set.
      * @return Whether a value was fully written.
      */
-    public <T> boolean writeSet(String name, Set<T> col, MessageCollectionItemType itemType);
+    <T> boolean writeSet(String name, Set<T> col, MessageCollectionItemType itemType);
 
     /**
      * Writes a map.
      *
-     * @param <K>     Type of the map's keys.
-     * @param <V>     Type of the map's values.
-     * @param name    Field name.
-     * @param map     Map.
+     * @param <K> Type of the map's keys.
+     * @param <V> Type of the map's values.
+     * @param name Field name.
+     * @param map Map.
      * @param keyType The type of the map's key.
      * @param valType The type of the map's value.
      * @return Whether a value was fully written.
      */
-    public <K, V> boolean writeMap(String name, Map<K, V> map, MessageCollectionItemType keyType,
+    <K, V> boolean writeMap(String name, Map<K, V> map, MessageCollectionItemType keyType,
             MessageCollectionItemType valType);
 
     /**
@@ -348,39 +411,39 @@
      *
      * @return Whether the message header has already been written.
      */
-    public boolean isHeaderWritten();
+    boolean isHeaderWritten();
 
     /**
      * Callback called when the header of the message is written.
      */
-    public void onHeaderWritten();
+    void onHeaderWritten();
 
     /**
      * Gets a current message state.
      *
      * @return State.
      */
-    public int state();
+    int state();
 
     /**
      * Increments a state.
      */
-    public void incrementState();
+    void incrementState();
 
     /**
      * Callback called before an inner message is written.
      */
-    public void beforeInnerMessageWrite();
+    void beforeInnerMessageWrite();
 
     /**
      * Callback called after an inner message is written.
      *
      * @param finished Whether the message was fully written.
      */
-    public void afterInnerMessageWrite(boolean finished);
+    void afterInnerMessageWrite(boolean finished);
 
     /**
      * Resets this writer.
      */
-    public void reset();
+    void reset();
 }
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageReader.java b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageReader.java
index b42b8c0..e11b5a3 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageReader.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageReader.java
@@ -94,6 +94,17 @@
         return val;
     }
 
+    @Override
+    public @Nullable Byte readBoxedByte(String name) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        Byte val = stream.readBoxedByte();
+
+        lastRead = stream.lastFinished();
+
+        return val;
+    }
+
     /** {@inheritDoc} */
     @Override
     public short readShort(String name) {
@@ -106,6 +117,17 @@
         return val;
     }
 
+    @Override
+    public @Nullable Short readBoxedShort(String name) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        Short val = stream.readBoxedShort();
+
+        lastRead = stream.lastFinished();
+
+        return val;
+    }
+
     /** {@inheritDoc} */
     @Override
     public int readInt(String name) {
@@ -125,7 +147,7 @@
     }
 
     @Override
-    public Integer readBoxedInt(String name) {
+    public @Nullable Integer readBoxedInt(String name) {
         DirectByteBufferStream stream = state.item().stream;
 
         Integer val = stream.readBoxedInt();
@@ -147,6 +169,17 @@
         return val;
     }
 
+    @Override
+    public @Nullable Long readBoxedLong(String name) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        Long val = stream.readBoxedLong();
+
+        lastRead = stream.lastFinished();
+
+        return val;
+    }
+
     /** {@inheritDoc} */
     @Override
     public float readFloat(String name) {
@@ -159,6 +192,17 @@
         return val;
     }
 
+    @Override
+    public @Nullable Float readBoxedFloat(String name) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        Float val = stream.readBoxedFloat();
+
+        lastRead = stream.lastFinished();
+
+        return val;
+    }
+
     /** {@inheritDoc} */
     @Override
     public double readDouble(String name) {
@@ -171,6 +215,17 @@
         return val;
     }
 
+    @Override
+    public @Nullable Double readBoxedDouble(String name) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        Double val = stream.readBoxedDouble();
+
+        lastRead = stream.lastFinished();
+
+        return val;
+    }
+
     /** {@inheritDoc} */
     @Override
     public char readChar(String name) {
@@ -183,6 +238,17 @@
         return val;
     }
 
+    @Override
+    public @Nullable Character readBoxedChar(String name) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        Character val = stream.readBoxedChar();
+
+        lastRead = stream.lastFinished();
+
+        return val;
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean readBoolean(String name) {
@@ -195,6 +261,17 @@
         return val;
     }
 
+    @Override
+    public @Nullable Boolean readBoxedBoolean(String name) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        Boolean val = stream.readBoxedBoolean();
+
+        lastRead = stream.lastFinished();
+
+        return val;
+    }
+
     /** {@inheritDoc} */
     @Nullable
     @Override
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
index 43bf3f1..cbc8798 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/DirectMessageWriter.java
@@ -96,6 +96,15 @@
         return stream.lastFinished();
     }
 
+    @Override
+    public boolean writeBoxedByte(String name, @Nullable Byte val) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        stream.writeBoxedByte(val);
+
+        return stream.lastFinished();
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean writeShort(String name, short val) {
@@ -106,6 +115,15 @@
         return stream.lastFinished();
     }
 
+    @Override
+    public boolean writeBoxedShort(String name, @Nullable Short val) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        stream.writeBoxedShort(val);
+
+        return stream.lastFinished();
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean writeInt(String name, int val) {
@@ -117,7 +135,7 @@
     }
 
     @Override
-    public boolean writeBoxedInt(String name, Integer val) {
+    public boolean writeBoxedInt(String name, @Nullable Integer val) {
         DirectByteBufferStream stream = state.item().stream;
 
         stream.writeBoxedInt(val);
@@ -135,6 +153,15 @@
         return stream.lastFinished();
     }
 
+    @Override
+    public boolean writeBoxedLong(String name, @Nullable Long val) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        stream.writeBoxedLong(val);
+
+        return stream.lastFinished();
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean writeFloat(String name, float val) {
@@ -145,6 +172,15 @@
         return stream.lastFinished();
     }
 
+    @Override
+    public boolean writeBoxedFloat(String name, @Nullable Float val) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        stream.writeBoxedFloat(val);
+
+        return stream.lastFinished();
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean writeDouble(String name, double val) {
@@ -155,6 +191,15 @@
         return stream.lastFinished();
     }
 
+    @Override
+    public boolean writeBoxedDouble(String name, @Nullable Double val) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        stream.writeBoxedDouble(val);
+
+        return stream.lastFinished();
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean writeChar(String name, char val) {
@@ -165,6 +210,15 @@
         return stream.lastFinished();
     }
 
+    @Override
+    public boolean writeBoxedChar(String name, @Nullable Character val) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        stream.writeBoxedChar(val);
+
+        return stream.lastFinished();
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean writeBoolean(String name, boolean val) {
@@ -175,6 +229,15 @@
         return stream.lastFinished();
     }
 
+    @Override
+    public boolean writeBoxedBoolean(String name, @Nullable Boolean val) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        stream.writeBoxedBoolean(val);
+
+        return stream.lastFinished();
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean writeByteArray(String name, @Nullable byte[] val) {
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStream.java b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStream.java
index fa5e097..b4af087 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStream.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStream.java
@@ -63,6 +63,13 @@
     void writeByte(byte val);
 
     /**
+     * Writes {@code Byte}.
+     *
+     * @param val Value.
+     */
+    void writeBoxedByte(@Nullable Byte val);
+
+    /**
      * Writes {@code short}.
      *
      * @param val Value.
@@ -70,6 +77,13 @@
     void writeShort(short val);
 
     /**
+     * Writes {@code Short}.
+     *
+     * @param val Value.
+     */
+    void writeBoxedShort(@Nullable Short val);
+
+    /**
      * Writes {@code int}.
      *
      * @param val Value.
@@ -91,6 +105,13 @@
     void writeLong(long val);
 
     /**
+     * Writes {@code Long}.
+     *
+     * @param val Value.
+     */
+    void writeBoxedLong(@Nullable Long val);
+
+    /**
      * Writes {@code float}.
      *
      * @param val Value.
@@ -98,6 +119,13 @@
     void writeFloat(float val);
 
     /**
+     * Writes {@code Float}.
+     *
+     * @param val Value.
+     */
+    void writeBoxedFloat(@Nullable Float val);
+
+    /**
      * Writes {@code double}.
      *
      * @param val Value.
@@ -105,6 +133,13 @@
     void writeDouble(double val);
 
     /**
+     * Writes {@code Double}.
+     *
+     * @param val Value.
+     */
+    void writeBoxedDouble(@Nullable Double val);
+
+    /**
      * Writes {@code char}.
      *
      * @param val Value.
@@ -112,6 +147,13 @@
     void writeChar(char val);
 
     /**
+     * Writes {@code Character}.
+     *
+     * @param val Value.
+     */
+    void writeBoxedChar(@Nullable Character val);
+
+    /**
      * Writes {@code boolean}.
      *
      * @param val Value.
@@ -119,6 +161,13 @@
     void writeBoolean(boolean val);
 
     /**
+     * Writes {@code Boolean}.
+     *
+     * @param val Value.
+     */
+    void writeBoxedBoolean(@Nullable Boolean val);
+
+    /**
      * Writes {@code byte} array.
      *
      * @param val Value.
@@ -285,6 +334,13 @@
     byte readByte();
 
     /**
+     * Reads {@code Byte}.
+     *
+     * @return Value.
+     */
+    @Nullable Byte readBoxedByte();
+
+    /**
      * Reads {@code short}.
      *
      * @return Value.
@@ -292,6 +348,13 @@
     short readShort();
 
     /**
+     * Reads {@code Short}.
+     *
+     * @return Value.
+     */
+    @Nullable Short readBoxedShort();
+
+    /**
      * Reads {@code int}.
      *
      * @return Value.
@@ -313,6 +376,13 @@
     long readLong();
 
     /**
+     * Reads {@code Long}.
+     *
+     * @return Value.
+     */
+    @Nullable Long readBoxedLong();
+
+    /**
      * Reads {@code float}.
      *
      * @return Value.
@@ -320,6 +390,13 @@
     float readFloat();
 
     /**
+     * Reads {@code Float}.
+     *
+     * @return Value.
+     */
+    @Nullable Float readBoxedFloat();
+
+    /**
      * Reads {@code double}.
      *
      * @return Value.
@@ -327,6 +404,13 @@
     double readDouble();
 
     /**
+     * Reads {@code Double}.
+     *
+     * @return Value.
+     */
+    @Nullable Double readBoxedDouble();
+
+    /**
      * Reads {@code char}.
      *
      * @return Value.
@@ -334,6 +418,13 @@
     char readChar();
 
     /**
+     * Reads {@code Character}.
+     *
+     * @return Value.
+     */
+    @Nullable Character readBoxedChar();
+
+    /**
      * Reads {@code boolean}.
      *
      * @return Value.
@@ -341,6 +432,13 @@
     boolean readBoolean();
 
     /**
+     * Reads {@code Boolean}.
+     *
+     * @return Value.
+     */
+    @Nullable Boolean readBoxedBoolean();
+
+    /**
      * Reads {@code byte} array.
      *
      * @return Value.
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
index 069450d..0bf37f5 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/direct/stream/DirectByteBufferStreamImplV1.java
@@ -49,6 +49,7 @@
 import java.util.Set;
 import java.util.UUID;
 import java.util.function.IntFunction;
+import java.util.function.Supplier;
 import org.apache.ignite.internal.util.ArrayFactory;
 import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.IgniteUtils;
@@ -109,6 +110,15 @@
      */
     private short msgGroupType;
 
+    /**
+     * Flag needed for reading boxed primitives.
+     *
+     * <p>Boxed primitives are encoded as a boolean flag ({@code false} meaning that the boxed value is {@code null}), followed by the
+     * unboxed value (if not null). Therefore, this flag value must be cached between two unsuccessful read calls in case the received boxed
+     * primitive was not {@code null}.
+     */
+    private boolean boxedTypeNotNull;
+
     @Nullable
     private MessageDeserializer<NetworkMessage> msgDeserializer;
 
@@ -208,6 +218,21 @@
         }
     }
 
+    @Override
+    public void writeBoxedByte(@Nullable Byte val) {
+        if (val != null) {
+            lastFinished = buf.remaining() >= 1 + 1;
+
+            if (lastFinished) {
+                writeBoolean(true);
+
+                writeByte(val);
+            }
+        } else {
+            writeBoolean(false);
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     public void writeShort(short val) {
@@ -228,6 +253,21 @@
         }
     }
 
+    @Override
+    public void writeBoxedShort(@Nullable Short val) {
+        if (val != null) {
+            lastFinished = buf.remaining() >= 1 + 2;
+
+            if (lastFinished) {
+                writeBoolean(true);
+
+                writeShort(val);
+            }
+        } else {
+            writeBoolean(false);
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     public void writeInt(int val) {
@@ -253,7 +293,7 @@
     }
 
     @Override
-    public void writeBoxedInt(Integer val) {
+    public void writeBoxedInt(@Nullable Integer val) {
         if (val != null) {
             lastFinished = buf.remaining() >= 1 + 5;
 
@@ -291,6 +331,21 @@
         }
     }
 
+    @Override
+    public void writeBoxedLong(@Nullable Long val) {
+        if (val != null) {
+            lastFinished = buf.remaining() >= 1 + 10;
+
+            if (lastFinished) {
+                writeBoolean(true);
+
+                writeLong(val);
+            }
+        } else {
+            writeBoolean(false);
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     public void writeFloat(float val) {
@@ -311,6 +366,21 @@
         }
     }
 
+    @Override
+    public void writeBoxedFloat(@Nullable Float val) {
+        if (val != null) {
+            lastFinished = buf.remaining() >= 1 + 4;
+
+            if (lastFinished) {
+                writeBoolean(true);
+
+                writeFloat(val);
+            }
+        } else {
+            writeBoolean(false);
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     public void writeDouble(double val) {
@@ -331,6 +401,21 @@
         }
     }
 
+    @Override
+    public void writeBoxedDouble(@Nullable Double val) {
+        if (val != null) {
+            lastFinished = buf.remaining() >= 1 + 8;
+
+            if (lastFinished) {
+                writeBoolean(true);
+
+                writeDouble(val);
+            }
+        } else {
+            writeBoolean(false);
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     public void writeChar(char val) {
@@ -351,6 +436,21 @@
         }
     }
 
+    @Override
+    public void writeBoxedChar(@Nullable Character val) {
+        if (val != null) {
+            lastFinished = buf.remaining() >= 1 + 2;
+
+            if (lastFinished) {
+                writeBoolean(true);
+
+                writeChar(val);
+            }
+        } else {
+            writeBoolean(false);
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     public void writeBoolean(boolean val) {
@@ -365,6 +465,21 @@
         }
     }
 
+    @Override
+    public void writeBoxedBoolean(@Nullable Boolean val) {
+        if (val != null) {
+            lastFinished = buf.remaining() >= 1 + 1;
+
+            if (lastFinished) {
+                writeBoolean(true);
+
+                writeBoolean(val);
+            }
+        } else {
+            writeBoolean(false);
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     public void writeByteArray(byte[] val) {
@@ -869,6 +984,29 @@
         }
     }
 
+    @Override
+    public @Nullable Byte readBoxedByte() {
+        return readBoxedValue(this::readByte);
+    }
+
+    private <T> @Nullable T readBoxedValue(Supplier<T> valueReader) {
+        // First, check if we have read the null flag in a previous call.
+        if (boxedTypeNotNull || readBoolean()) {
+            boxedTypeNotNull = true;
+
+            T result = valueReader.get();
+
+            // If the whole value has been read successfully, reset the state.
+            if (lastFinished) {
+                boxedTypeNotNull = false;
+            }
+
+            return result;
+        } else {
+            return null;
+        }
+    }
+
     /** {@inheritDoc} */
     @Override
     public short readShort() {
@@ -887,6 +1025,11 @@
         }
     }
 
+    @Override
+    public @Nullable Short readBoxedShort() {
+        return readBoxedValue(this::readShort);
+    }
+
     /** {@inheritDoc} */
     @Override
     public int readInt() {
@@ -925,20 +1068,8 @@
     }
 
     @Override
-    public Integer readBoxedInt() {
-        int pos = buf.position();
-
-        int limit = buf.limit();
-
-        if (limit - pos >= 5) {
-            if (readBoolean()) {
-                return readInt();
-            } else {
-                return null;
-            }
-        }
-
-        return null;
+    public @Nullable Integer readBoxedInt() {
+        return readBoxedValue(this::readInt);
     }
 
     /** {@inheritDoc} */
@@ -978,6 +1109,11 @@
         return val;
     }
 
+    @Override
+    public @Nullable Long readBoxedLong() {
+        return readBoxedValue(this::readLong);
+    }
+
     /** {@inheritDoc} */
     @Override
     public float readFloat() {
@@ -996,6 +1132,11 @@
         }
     }
 
+    @Override
+    public @Nullable Float readBoxedFloat() {
+        return readBoxedValue(this::readFloat);
+    }
+
     /** {@inheritDoc} */
     @Override
     public double readDouble() {
@@ -1014,6 +1155,11 @@
         }
     }
 
+    @Override
+    public @Nullable Double readBoxedDouble() {
+        return readBoxedValue(this::readDouble);
+    }
+
     /** {@inheritDoc} */
     @Override
     public char readChar() {
@@ -1032,6 +1178,11 @@
         }
     }
 
+    @Override
+    public @Nullable Character readBoxedChar() {
+        return readBoxedValue(this::readChar);
+    }
+
     /** {@inheritDoc} */
     @Override
     public boolean readBoolean() {
@@ -1048,6 +1199,11 @@
         }
     }
 
+    @Override
+    public @Nullable Boolean readBoxedBoolean() {
+        return readBoxedValue(this::readBoolean);
+    }
+
     /** {@inheritDoc} */
     @Override
     public byte[] readByteArray() {
diff --git a/modules/network/src/test/java/org/apache/ignite/internal/network/AllTypesMessageGenerator.java b/modules/network/src/test/java/org/apache/ignite/internal/network/AllTypesMessageGenerator.java
index f27b3f8..afd799c 100644
--- a/modules/network/src/test/java/org/apache/ignite/internal/network/AllTypesMessageGenerator.java
+++ b/modules/network/src/test/java/org/apache/ignite/internal/network/AllTypesMessageGenerator.java
@@ -106,23 +106,27 @@
      */
     @Nullable
     private static Object randomValue(Random random, Field field, boolean nestedMsg) {
+        if (field.isAnnotationPresent(Nullable.class) && random.nextBoolean()) {
+            return null;
+        }
+
         Class<?> type = field.getType();
 
-        if (type == byte.class) {
+        if (type == byte.class || type == Byte.class) {
             return (byte) random.nextInt();
-        } else if (type == short.class) {
+        } else if (type == short.class || type == Short.class) {
             return (short) random.nextInt();
-        } else if (type == int.class) {
+        } else if (type == int.class || type == Integer.class) {
             return random.nextInt();
-        } else if (type == long.class) {
+        } else if (type == long.class || type == Long.class) {
             return random.nextLong();
-        } else if (type == float.class) {
+        } else if (type == float.class || type == Float.class) {
             return random.nextFloat();
-        } else if (type == double.class) {
+        } else if (type == double.class || type == Double.class) {
             return random.nextDouble();
-        } else if (type == char.class) {
+        } else if (type == char.class || type == Character.class) {
             return (char) random.nextInt();
-        } else if (type == boolean.class) {
+        } else if (type == boolean.class || type == Boolean.class) {
             return random.nextBoolean();
         } else if (type == byte[].class) {
             int byteArrLen = random.nextInt(1024);
diff --git a/modules/network/src/test/java/org/apache/ignite/internal/network/processor/MarshallableBlacklistTest.java b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/MarshallableBlacklistTest.java
new file mode 100644
index 0000000..a2f0e99
--- /dev/null
+++ b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/MarshallableBlacklistTest.java
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.network.processor;
+
+import static com.google.testing.compile.CompilationSubject.assertThat;
+import static com.google.testing.compile.JavaFileObjects.forResource;
+import static com.google.testing.compile.JavaFileObjects.forSourceLines;
+import static org.junit.jupiter.params.provider.Arguments.arguments;
+
+import com.google.testing.compile.Compilation;
+import com.google.testing.compile.Compiler;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.locks.Lock;
+import java.util.stream.Stream;
+import javax.tools.JavaFileObject;
+import org.apache.ignite.internal.network.processor.messages.MarshallableTypesBlackList;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+/**
+ * Test case for the marshallable types blacklist.
+ */
+public class MarshallableBlacklistTest {
+    private static final JavaFileObject MESSAGE_GROUP = forResource("org/apache/ignite/internal/network/processor/TestMessageGroup.java");
+
+    /**
+     * Compiler instance configured with the annotation processor being tested.
+     */
+    private final Compiler compiler = Compiler.javac().withProcessors(new TransferableObjectProcessor());
+
+    private static List<String> marshallableFieldSourceCode(Class<?> fieldType) {
+        return testMessageSourceCode(String.format("%s foo();", fieldType.getName()));
+    }
+
+    private static List<String> marshallableCollectionSourceCode(Class<?> collectionType, Class<?> fieldType) {
+        return testMessageSourceCode(String.format("%s<%s> foo();", collectionType.getName(), fieldType.getName()));
+    }
+
+    private static List<String> marshallableArraySourceCode(Class<?> fieldType) {
+        return testMessageSourceCode(String.format("%s[] foo();", fieldType.getName()));
+    }
+
+    private static List<String> marshallableMapSourceCode(Class<?> keyType, Class<?> valueType) {
+        return testMessageSourceCode(String.format("%s<%s, %s> foo();", Map.class.getName(), keyType.getName(), valueType.getName()));
+    }
+
+    private static List<String> marshallableNestedMapSourceCode(Class<?> keyType, Class<?> valueType) {
+        return testMessageSourceCode(String.format(
+                "%s<%s, %s<%s>> foo();",
+                Map.class.getName(), keyType.getName(), List.class.getName(), valueType.getName())
+        );
+    }
+
+    private static List<String> testMessageSourceCode(String fieldDeclaration) {
+        return List.of(
+                "package org.apache.ignite.internal.network.processor;",
+
+                "import org.apache.ignite.network.NetworkMessage;",
+                "import org.apache.ignite.network.annotations.Transferable;",
+                "import org.apache.ignite.network.annotations.Marshallable;",
+
+                "@Transferable(1)",
+                "public interface TestMessage extends NetworkMessage {",
+                "    @Marshallable",
+                fieldDeclaration,
+                "}"
+        );
+    }
+
+    private static List<Class<?>> nativeTypes() {
+        return MarshallableTypesBlackList.NATIVE_TYPES;
+    }
+
+    private static Stream<Arguments> collectionTypes() {
+        return Stream.of(Collection.class, List.class, Set.class)
+                .flatMap(collectionType -> nativeTypes().stream().map(type -> arguments(collectionType, type)));
+    }
+
+    @ParameterizedTest(name = "{0}")
+    @MethodSource("nativeTypes")
+    void testMessageWithNativeTypeField(Class<?> type) {
+        Compilation compilation = compile(marshallableFieldSourceCode(type));
+
+        assertThat(compilation).hadErrorContaining(
+                "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+        );
+    }
+
+    @ParameterizedTest(name = "{0}[]")
+    @MethodSource("nativeTypes")
+    void testMessageWithNativeArrayTypeField(Class<?> type) {
+        Compilation compilation = compile(marshallableArraySourceCode(type));
+
+        assertThat(compilation).hadErrorContaining(
+                "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+        );
+    }
+
+    @ParameterizedTest(name = "{0}<{1}>")
+    @MethodSource("collectionTypes")
+    void testMessageWithCollectionNativeTypeField(Class<?> collectionType, Class<?> type) {
+        Compilation compilation = compile(marshallableCollectionSourceCode(collectionType, type));
+
+        assertThat(compilation).hadErrorContaining(
+                "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+        );
+    }
+
+    @Test
+    void testMessageWithMarshallableMapNativeKey() {
+        Compilation compilation = compile(marshallableMapSourceCode(Integer.class, Lock.class));
+
+        assertThat(compilation).succeededWithoutWarnings();
+    }
+
+    @Test
+    void testMessageWithMarshallableMapNativeValue() {
+        Compilation compilation = compile(marshallableMapSourceCode(Lock.class, Integer.class));
+
+        assertThat(compilation).succeededWithoutWarnings();
+    }
+
+    @Test
+    void testMessageWithNativeTypeMap() {
+        Compilation compilation = compile(marshallableMapSourceCode(Integer.class, String.class));
+
+        assertThat(compilation).hadErrorContaining(
+                "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+        );
+    }
+
+    @Test
+    void testMessageWithNestedNativeTypeMap() {
+        Compilation compilation = compile(marshallableNestedMapSourceCode(Integer.class, String.class));
+
+        assertThat(compilation).hadErrorContaining(
+                "\"foo\" field is marked as @Marshallable but this type is supported by native serialization"
+        );
+    }
+
+    @Test
+    void testMessageWithNestedMarshallableTypeMap() {
+        Compilation compilation = compile(marshallableNestedMapSourceCode(Integer.class, Lock.class));
+
+        assertThat(compilation).succeededWithoutWarnings();
+    }
+
+    private Compilation compile(List<String> code) {
+        return compiler.compile(
+                forSourceLines("org.apache.ignite.internal.network.processor.TestMessage", code),
+                MESSAGE_GROUP
+        );
+    }
+}
diff --git a/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
index bb7c034..56c5844 100644
--- a/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
+++ b/modules/network/src/test/java/org/apache/ignite/internal/network/processor/TransferableObjectProcessorTest.java
@@ -257,7 +257,9 @@
     void testFieldBothNetworkMessageAndMarkedMarshallable() {
         Compilation compilation = compile("MessageWithMarshallableNetworkMessageField");
 
-        assertThat(compilation).hadErrorContaining("msgField is both NetworkMessage and @Marshallable");
+        assertThat(compilation).hadErrorContaining(
+                "\"msgField\" field is marked as @Marshallable but this type is supported by native serialization"
+        );
     }
 
     /**
diff --git a/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/messages/AllTypesMessage.java b/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/messages/AllTypesMessage.java
index ce36a76..16a7ba0 100644
--- a/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/messages/AllTypesMessage.java
+++ b/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/messages/AllTypesMessage.java
@@ -37,20 +37,36 @@
 public interface AllTypesMessage extends NetworkMessage, Serializable {
     byte byteA();
 
+    @Nullable Byte boxedByte();
+
     short shortB();
 
+    @Nullable Short boxedShort();
+
     int intC();
 
+    @Nullable Integer boxedInt();
+
     long longD();
 
+    @Nullable Long boxedLong();
+
     float floatE();
 
+    @Nullable Float boxedFloat();
+
     double doubleF();
 
+    @Nullable Double boxedDouble();
+
     char charG();
 
+    @Nullable Character boxedChar();
+
     boolean booleanH();
 
+    @Nullable Boolean boxedBoolean();
+
     byte @Nullable [] byteArrI();
 
     short @Nullable [] shortArrJ();
diff --git a/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/serialization/SimpleSerializableObject.java b/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/serialization/SimpleSerializableObject.java
index ef07f6e..669a152 100644
--- a/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/serialization/SimpleSerializableObject.java
+++ b/modules/network/src/testFixtures/java/org/apache/ignite/internal/network/serialization/SimpleSerializableObject.java
@@ -22,7 +22,7 @@
 
 /** Serializable class for marshallable test. */
 public class SimpleSerializableObject implements Serializable {
-    private static final long serialVersionUid = 0L;
+    private static final long serialVersionUID = 0L;
 
     private final int val;
 
diff --git a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/entity/LocalStorageOutter.java b/modules/raft/src/main/java/org/apache/ignite/raft/jraft/entity/LocalStorageOutter.java
index 0abdea9..3aa59af 100644
--- a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/entity/LocalStorageOutter.java
+++ b/modules/raft/src/main/java/org/apache/ignite/raft/jraft/entity/LocalStorageOutter.java
@@ -20,7 +20,6 @@
 package org.apache.ignite.raft.jraft.entity;
 
 import java.util.List;
-import org.apache.ignite.network.annotations.Marshallable;
 import org.apache.ignite.network.annotations.Transferable;
 import org.apache.ignite.raft.jraft.RaftMessageGroup;
 import org.apache.ignite.raft.jraft.rpc.Message;
@@ -39,7 +38,6 @@
         @Nullable
         RaftOutter.SnapshotMeta meta();
 
-        @Marshallable
         List<LocalStorageOutter.LocalSnapshotPbMeta.File> filesList();
 
         @Transferable(value = RaftMessageGroup.RaftOutterMessageGroup.LOCAL_SNAPSHOT_META_FILE)
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ReadWriteReplicaRequest.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ReadWriteReplicaRequest.java
index 91316aa..cec5215 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ReadWriteReplicaRequest.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ReadWriteReplicaRequest.java
@@ -20,7 +20,6 @@
 import java.util.UUID;
 import org.apache.ignite.internal.replicator.message.PrimaryReplicaRequest;
 import org.apache.ignite.internal.replicator.message.TimestampAware;
-import org.apache.ignite.network.annotations.Marshallable;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -39,6 +38,5 @@
     // TODO: IGNITE-19457 Maybe not nullable.
     @Deprecated
     @Nullable
-    @Marshallable
     Long term();
 }
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ScanRetrieveBatchReplicaRequest.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ScanRetrieveBatchReplicaRequest.java
index cf67762..a0a8ebe 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ScanRetrieveBatchReplicaRequest.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replication/request/ScanRetrieveBatchReplicaRequest.java
@@ -83,6 +83,5 @@
      * @return Bitset to include columns.
      */
     @Nullable
-    @Marshallable
     BitSet columnsToInclude();
 }
diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxCleanupReplicaRequest.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxCleanupReplicaRequest.java
index 12b1fcc..d5503e7 100644
--- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxCleanupReplicaRequest.java
+++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxCleanupReplicaRequest.java
@@ -23,7 +23,6 @@
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.replicator.message.ReplicaRequest;
 import org.apache.ignite.internal.replicator.message.TimestampAware;
-import org.apache.ignite.network.annotations.Marshallable;
 import org.apache.ignite.network.annotations.Transferable;
 import org.jetbrains.annotations.Nullable;
 
@@ -74,6 +73,5 @@
      * @return Raft term.
      */
     @Deprecated
-    @Marshallable
     Long term();
 }
diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxFinishReplicaRequest.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxFinishReplicaRequest.java
index 610a41e..208d8b4 100644
--- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxFinishReplicaRequest.java
+++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/message/TxFinishReplicaRequest.java
@@ -84,6 +84,5 @@
      * @return Raft term.
      */
     @Deprecated
-    @Marshallable
     Long term();
 }