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

nizhikov 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 79f5f665a02 IGNITE-25090 Move BinaryUtils methods to binary-impl 
(#12636) (#13568)
79f5f665a02 is described below

commit 79f5f665a024d046b8fea521a76c529ac8caeb6f
Author: Nikolay <[email protected]>
AuthorDate: Thu Sep 24 13:23:43 2026 +0300

    IGNITE-25090 Move BinaryUtils methods to binary-impl (#12636) (#13568)
---
 .../ignite/internal/binary/BinaryObjectEx.java     |   5 +
 .../internal/binary/BinaryReaderHandlesHolder.java |   7 -
 .../binary/BinaryReaderHandlesHolderImpl.java      |   5 -
 .../apache/ignite/internal/binary/BinaryUtils.java | 525 ---------------------
 .../binary/BinaryArrayIdentityResolver.java        |   2 +-
 .../ignite/internal/binary/BinaryImplUtils.java    | 520 ++++++++++++++++++++
 .../ignite/internal/binary/BinaryObjectImpl.java   |  28 +-
 .../internal/binary/BinaryObjectOffheapImpl.java   |  20 +-
 .../ignite/internal/binary/BinaryReaderExImpl.java |  39 +-
 .../ignite/internal/binary/BinaryWriterExImpl.java |  18 +-
 .../internal/binary/BinaryWriterSchemaHolder.java  |  12 +-
 .../binary/CrossObjectReferenceResolver.java       |  24 +-
 .../ignite/internal/binary/ObjectDetachHelper.java |   4 +-
 .../binary/builder/BinaryBuilderReader.java        |   3 +-
 .../binary/builder/BinaryBuilderSerializer.java    |   5 +-
 .../binary/builder/BinaryObjectBuilderImpl.java    |  35 +-
 .../processors/cache/verify/IdleVerifyUtility.java |   3 +-
 .../ignite/client/BinaryConfigurationTest.java     |   2 +-
 .../BinarySerialiedFieldComparatorSelfTest.java    |   4 +-
 .../binary/BinarySerializedFieldComparator.java    |   6 +-
 .../internal/metric/MetricsConfigurationTest.java  |   2 +-
 .../apache/ignite/testframework/GridTestUtils.java |  40 ++
 22 files changed, 673 insertions(+), 636 deletions(-)

diff --git 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java
index f8e5c067810..f5d8d61d62e 100644
--- 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java
@@ -141,4 +141,9 @@ public interface BinaryObjectEx extends BinaryObject {
     public default boolean hasCircularReferences() {
         return false;
     }
+
+    /** @return {@code true} if binary object has compact footer. */
+    public default boolean isCompactFooter() {
+        return false;
+    }
 }
diff --git 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java
index 01c05e97dfb..5308d9e0766 100644
--- 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolder.java
@@ -21,13 +21,6 @@ package org.apache.ignite.internal.binary;
  * Holder for handles.
  */
 interface BinaryReaderHandlesHolder {
-    /**
-     * Set handle.
-     *
-     * @param obj Object.
-     */
-    public void setHandle(Object obj);
-
     /**
      * Set handle.
      *
diff --git 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java
index 0d1c0cd3b91..6adb2f2f1a7 100644
--- 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryReaderHandlesHolderImpl.java
@@ -24,11 +24,6 @@ class BinaryReaderHandlesHolderImpl implements 
BinaryReaderHandlesHolder {
     /** Handles. */
     private BinaryReaderHandles hnds;
 
-    /** {@inheritDoc} */
-    @Override public void setHandle(Object obj) {
-        throw new UnsupportedOperationException();
-    }
-
     /** {@inheritDoc} */
     @Override public void setHandle(Object obj, int pos) {
         handles().put(pos, obj);
diff --git 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
index cabf276f834..d3585cb869c 100644
--- 
a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
+++ 
b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
@@ -38,7 +38,6 @@ import java.nio.charset.StandardCharsets;
 import java.sql.Time;
 import java.sql.Timestamp;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
@@ -86,7 +85,6 @@ import org.apache.ignite.internal.util.MutableSingletonList;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.T2;
 import org.apache.ignite.internal.util.typedef.internal.A;
-import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.logger.NullLogger;
 import org.apache.ignite.marshaller.Marshallers;
@@ -131,49 +129,12 @@ public class BinaryUtils {
         TreeSet.class, new BinaryTreeSetWriteReplacer()
     );
 
-    /** {@code true} if serialized value of this type cannot contain 
references to objects. */
-    private static final boolean[] PLAIN_TYPE_FLAG = new boolean[102];
-
     /** Binary classes. */
     private static final Collection<Class<?>> BINARY_CLS;
 
     /** Class for SingletonList obtained at runtime. */
     static final Class<? extends Collection> SINGLETON_LIST_CLS = 
Collections.singletonList(null).getClass();
 
-    /** Flag: user type. */
-    static final short FLAG_USR_TYP = 0x0001;
-
-    /** Flag: only raw data exists. */
-    static final short FLAG_HAS_SCHEMA = 0x0002;
-
-    /** Flag indicating that object has raw data. */
-    static final short FLAG_HAS_RAW = 0x0004;
-
-    /** Flag: offsets take 1 byte. */
-    static final short FLAG_OFFSET_ONE_BYTE = 0x0008;
-
-    /** Flag: offsets take 2 bytes. */
-    static final short FLAG_OFFSET_TWO_BYTES = 0x0010;
-
-    /** Flag: compact footer, no field IDs. */
-    public static final short FLAG_COMPACT_FOOTER = 0x0020;
-
-    /** Flag: raw data contains .NET type information. Always 0 in Java. Keep 
it here for information only. */
-    @SuppressWarnings("unused")
-    public static final short FLAG_CUSTOM_DOTNET_TYPE = 0x0040;
-
-    /** Offset which fits into 1 byte. */
-    static final int OFFSET_1 = 1;
-
-    /** Offset which fits into 2 bytes. */
-    static final int OFFSET_2 = 2;
-
-    /** Offset which fits into 4 bytes. */
-    static final int OFFSET_4 = 4;
-
-    /** Field ID length. */
-    static final int FIELD_ID_LEN = 4;
-
     /** Whether to sort field in binary objects (doesn't affect 
Binarylizable). */
     public static boolean FIELDS_SORTED_ORDER =
         
IgniteCommonsSystemProperties.getBoolean(IgniteCommonsSystemProperties.IGNITE_BINARY_SORT_OBJECT_FIELDS);
@@ -272,19 +233,6 @@ public class BinaryUtils {
 
         BINARY_CLS = Set.copyOf(FLAG_TO_CLASS.values());
 
-        for (byte b : new byte[] {
-            GridBinaryMarshaller.BYTE, GridBinaryMarshaller.SHORT, 
GridBinaryMarshaller.INT, GridBinaryMarshaller.LONG,
-            GridBinaryMarshaller.FLOAT, GridBinaryMarshaller.DOUBLE, 
GridBinaryMarshaller.CHAR, GridBinaryMarshaller.BOOLEAN,
-            GridBinaryMarshaller.DECIMAL, GridBinaryMarshaller.STRING, 
GridBinaryMarshaller.UUID, GridBinaryMarshaller.DATE,
-            GridBinaryMarshaller.TIMESTAMP, GridBinaryMarshaller.TIME, 
GridBinaryMarshaller.BYTE_ARR, GridBinaryMarshaller.SHORT_ARR,
-            GridBinaryMarshaller.INT_ARR, GridBinaryMarshaller.LONG_ARR, 
GridBinaryMarshaller.FLOAT_ARR, GridBinaryMarshaller.DOUBLE_ARR,
-            GridBinaryMarshaller.TIME_ARR, GridBinaryMarshaller.CHAR_ARR, 
GridBinaryMarshaller.BOOLEAN_ARR,
-            GridBinaryMarshaller.DECIMAL_ARR, GridBinaryMarshaller.STRING_ARR, 
GridBinaryMarshaller.UUID_ARR, GridBinaryMarshaller.DATE_ARR,
-            GridBinaryMarshaller.TIMESTAMP_ARR, GridBinaryMarshaller.ENUM, 
GridBinaryMarshaller.ENUM_ARR, GridBinaryMarshaller.NULL}) {
-
-            PLAIN_TYPE_FLAG[b] = true;
-        }
-
         FIELD_TYPE_NAMES = new String[104];
 
         FIELD_TYPE_NAMES[GridBinaryMarshaller.BYTE] = "byte";
@@ -326,57 +274,6 @@ public class BinaryUtils {
         FIELD_TYPE_NAMES[GridBinaryMarshaller.BINARY_ENUM] = "Enum";
     }
 
-    /**
-     * Check if user type flag is set.
-     *
-     * @param flags Flags.
-     * @return {@code True} if set.
-     */
-    static boolean isUserType(short flags) {
-        return isFlagSet(flags, FLAG_USR_TYP);
-    }
-
-    /**
-     * Check if raw-only flag is set.
-     *
-     * @param flags Flags.
-     * @return {@code True} if set.
-     */
-    public static boolean hasSchema(short flags) {
-        return isFlagSet(flags, FLAG_HAS_SCHEMA);
-    }
-
-    /**
-     * Check if raw-only flag is set.
-     *
-     * @param flags Flags.
-     * @return {@code True} if set.
-     */
-    static boolean hasRaw(short flags) {
-        return isFlagSet(flags, FLAG_HAS_RAW);
-    }
-
-    /**
-     * Check if "no-field-ids" flag is set.
-     *
-     * @param flags Flags.
-     * @return {@code True} if set.
-     */
-    static boolean isCompactFooter(short flags) {
-        return isFlagSet(flags, FLAG_COMPACT_FOOTER);
-    }
-
-    /**
-     * Check whether particular flag is set.
-     *
-     * @param flags Flags.
-     * @param flag Flag.
-     * @return {@code True} if flag is set in flags.
-     */
-    static boolean isFlagSet(short flags, short flag) {
-        return (flags & flag) == flag;
-    }
-
     /**
      * Schema initial ID.
      *
@@ -417,172 +314,6 @@ public class BinaryUtils {
         return FIELD_TYPE_NAMES[typeId];
     }
 
-    /**
-     * Write value with flag. e.g. writePlainObject(writer, (byte)77) will 
write two byte: {BYTE, 77}.
-     *
-     * @param writer W
-     * @param val Value.
-     */
-    public static void writePlainObject(BinaryWriterEx writer, Object val) {
-        Byte flag = PLAIN_CLASS_TO_FLAG.get(val.getClass());
-
-        if (flag == null)
-            throw new IllegalArgumentException("Can't write object with type: 
" + val.getClass());
-
-        switch (flag) {
-            case GridBinaryMarshaller.BYTE:
-                writer.writeByte(flag);
-                writer.writeByte((Byte)val);
-
-                break;
-
-            case GridBinaryMarshaller.SHORT:
-                writer.writeByte(flag);
-                writer.writeShort((Short)val);
-
-                break;
-
-            case GridBinaryMarshaller.INT:
-                writer.writeByte(flag);
-                writer.writeInt((Integer)val);
-
-                break;
-
-            case GridBinaryMarshaller.LONG:
-                writer.writeByte(flag);
-                writer.writeLong((Long)val);
-
-                break;
-
-            case GridBinaryMarshaller.FLOAT:
-                writer.writeByte(flag);
-                writer.writeFloat((Float)val);
-
-                break;
-
-            case GridBinaryMarshaller.DOUBLE:
-                writer.writeByte(flag);
-                writer.writeDouble((Double)val);
-
-                break;
-
-            case GridBinaryMarshaller.CHAR:
-                writer.writeByte(flag);
-                writer.writeChar((Character)val);
-
-                break;
-
-            case GridBinaryMarshaller.BOOLEAN:
-                writer.writeByte(flag);
-                writer.writeBoolean((Boolean)val);
-
-                break;
-
-            case GridBinaryMarshaller.DECIMAL:
-                writer.writeDecimal((BigDecimal)val);
-
-                break;
-
-            case GridBinaryMarshaller.STRING:
-                writer.writeString((String)val);
-
-                break;
-
-            case GridBinaryMarshaller.UUID:
-                writer.writeUuid((UUID)val);
-
-                break;
-
-            case GridBinaryMarshaller.DATE:
-                writer.writeDate((Date)val);
-
-                break;
-
-            case GridBinaryMarshaller.TIMESTAMP:
-                writer.writeTimestamp((Timestamp)val);
-
-                break;
-
-            case GridBinaryMarshaller.TIME:
-                writer.writeTime((Time)val);
-
-                break;
-
-            case GridBinaryMarshaller.BYTE_ARR:
-                writer.writeByteArray((byte[])val);
-
-                break;
-
-            case GridBinaryMarshaller.SHORT_ARR:
-                writer.writeShortArray((short[])val);
-
-                break;
-
-            case GridBinaryMarshaller.INT_ARR:
-                writer.writeIntArray((int[])val);
-
-                break;
-
-            case GridBinaryMarshaller.LONG_ARR:
-                writer.writeLongArray((long[])val);
-
-                break;
-
-            case GridBinaryMarshaller.FLOAT_ARR:
-                writer.writeFloatArray((float[])val);
-
-                break;
-
-            case GridBinaryMarshaller.DOUBLE_ARR:
-                writer.writeDoubleArray((double[])val);
-
-                break;
-
-            case GridBinaryMarshaller.CHAR_ARR:
-                writer.writeCharArray((char[])val);
-
-                break;
-
-            case GridBinaryMarshaller.BOOLEAN_ARR:
-                writer.writeBooleanArray((boolean[])val);
-
-                break;
-
-            case GridBinaryMarshaller.DECIMAL_ARR:
-                writer.writeDecimalArray((BigDecimal[])val);
-
-                break;
-
-            case GridBinaryMarshaller.STRING_ARR:
-                writer.writeStringArray((String[])val);
-
-                break;
-
-            case GridBinaryMarshaller.UUID_ARR:
-                writer.writeUuidArray((UUID[])val);
-
-                break;
-
-            case GridBinaryMarshaller.DATE_ARR:
-                writer.writeDateArray((Date[])val);
-
-                break;
-
-            case GridBinaryMarshaller.TIMESTAMP_ARR:
-                writer.writeTimestampArray((Timestamp[])val);
-
-                break;
-
-            case GridBinaryMarshaller.TIME_ARR:
-                writer.writeTimeArray((Time[])val);
-
-                break;
-
-            default:
-                throw new IllegalArgumentException("Can't write object with 
type: " + val.getClass());
-        }
-    }
-
     /**
      * @param obj Value to unwrap.
      * @return Unwrapped value.
@@ -594,24 +325,6 @@ public class BinaryUtils {
         return obj;
     }
 
-    /**
-     * @return {@code true} if content of serialized value cannot contain 
references to other object.
-     */
-    public static boolean isPlainType(int type) {
-        return type > 0 && type < PLAIN_TYPE_FLAG.length && 
PLAIN_TYPE_FLAG[type];
-    }
-
-    /**
-     * Checks whether an array type values can or can not contain references 
to other object.
-     *
-     * @param type Array type.
-     * @return {@code true} if content of serialized array value cannot 
contain references to other object.
-     */
-    public static boolean isPlainArrayType(int type) {
-        return (type >= GridBinaryMarshaller.BYTE_ARR && type <= 
GridBinaryMarshaller.DATE_ARR)
-            || type == GridBinaryMarshaller.TIMESTAMP_ARR || type == 
GridBinaryMarshaller.TIME_ARR;
-    }
-
     /**
      * @param cls Class.
      * @return Binary field type.
@@ -784,160 +497,6 @@ public class BinaryUtils {
         return in.readIntPositioned(start + 
GridBinaryMarshaller.TOTAL_LEN_POS);
     }
 
-    /** */
-    static int dataStartRelative(BinaryPositionReadable in, int start) {
-        int typeId = in.readIntPositioned(start + 
GridBinaryMarshaller.TYPE_ID_POS);
-
-        if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) {
-            // Gets the length of the type name which is stored as string.
-            int len = in.readIntPositioned(start + 
GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1);
-
-            return GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1 + 
/** string length */ 4 + len;
-        }
-        else
-            return GridBinaryMarshaller.DFLT_HDR_LEN;
-    }
-
-    /**
-     * Get footer start of the object.
-     *
-     * @param in Input stream.
-     * @param start Object start position inside the stream.
-     * @return Footer start.
-     */
-    private static int footerStartRelative(BinaryPositionReadable in, int 
start) {
-        short flags = in.readShortPositioned(start + 
GridBinaryMarshaller.FLAGS_POS);
-
-        if (hasSchema(flags))
-            // Schema exists, use offset.
-            return in.readIntPositioned(start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
-        else
-            // No schema, footer start equals to object end.
-            return length(in, start);
-    }
-
-    /**
-     * Get object's footer.
-     *
-     * @param in Input stream.
-     * @param start Start position.
-     * @return Footer start.
-     */
-    public static int footerStartAbsolute(BinaryPositionReadable in, int 
start) {
-        return footerStartRelative(in, start) + start;
-    }
-
-    /**
-     * Get object's footer.
-     *
-     * @param in Input stream.
-     * @param start Start position.
-     * @return Footer.
-     */
-    public static IgniteBiTuple<Integer, Integer> 
footerAbsolute(BinaryPositionReadable in, int start) {
-        short flags = in.readShortPositioned(start + 
GridBinaryMarshaller.FLAGS_POS);
-
-        int footerEnd = length(in, start);
-
-        if (hasSchema(flags)) {
-            // Schema exists.
-            int footerStart = in.readIntPositioned(start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
-
-            if (hasRaw(flags))
-                footerEnd -= 4;
-
-            assert footerStart <= footerEnd;
-
-            return F.t(start + footerStart, start + footerEnd);
-        }
-        else
-            // No schema.
-            return F.t(start + footerEnd, start + footerEnd);
-    }
-
-    /**
-     * Get relative raw offset of the object.
-     *
-     * @param in Input stream.
-     * @param start Object start position inside the stream.
-     * @return Raw offset.
-     */
-    private static int rawOffsetRelative(BinaryPositionReadable in, int start) 
{
-        short flags = in.readShortPositioned(start + 
GridBinaryMarshaller.FLAGS_POS);
-
-        int len = length(in, start);
-
-        if (hasSchema(flags)) {
-            // Schema exists.
-            if (hasRaw(flags))
-                // Raw offset is set, it is at the very end of the object.
-                return in.readIntPositioned(start + len - 4);
-            else
-                // Raw offset is not set, so just return schema offset.
-                return in.readIntPositioned(start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
-        }
-        else
-            // No schema, raw offset is located on schema offset position.
-            return in.readIntPositioned(start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
-    }
-
-    /**
-     * Get absolute raw offset of the object.
-     *
-     * @param in Input stream.
-     * @param start Object start position inside the stream.
-     * @return Raw offset.
-     */
-    public static int rawOffsetAbsolute(BinaryPositionReadable in, int start) {
-        return start + rawOffsetRelative(in, start);
-    }
-
-    /**
-     * Get offset length for the given flags.
-     *
-     * @param flags Flags.
-     * @return Offset size.
-     */
-    public static int fieldOffsetLength(short flags) {
-        if ((flags & FLAG_OFFSET_ONE_BYTE) == FLAG_OFFSET_ONE_BYTE)
-            return OFFSET_1;
-        else if ((flags & FLAG_OFFSET_TWO_BYTES) == FLAG_OFFSET_TWO_BYTES)
-            return OFFSET_2;
-        else
-            return OFFSET_4;
-    }
-
-    /**
-     * Get field ID length.
-     *
-     * @param flags Flags.
-     * @return Field ID length.
-     */
-    public static int fieldIdLength(short flags) {
-        return isCompactFooter(flags) ? 0 : FIELD_ID_LEN;
-    }
-
-    /**
-     * Get relative field offset.
-     *
-     * @param stream Stream.
-     * @param pos Position.
-     * @param fieldOffsetSize Field offset size.
-     * @return Relative field offset.
-     */
-    public static int fieldOffsetRelative(BinaryPositionReadable stream, int 
pos, int fieldOffsetSize) {
-        int res;
-
-        if (fieldOffsetSize == OFFSET_1)
-            res = (int)stream.readBytePositioned(pos) & 0xFF;
-        else if (fieldOffsetSize == OFFSET_2)
-            res = (int)stream.readShortPositioned(pos) & 0xFFFF;
-        else
-            res = stream.readIntPositioned(pos);
-
-        return res;
-    }
-
     /**
      * Merge old and new metas.
      *
@@ -2705,14 +2264,6 @@ public class BinaryUtils {
         );
     }
 
-    /**
-     * @param val Value to check.
-     * @return {@code True} if {@code val} instance of {@link BinaryEnumArray}.
-     */
-    public static boolean isBinaryEnumArray(Object val) {
-        return val instanceof BinaryEnumArray;
-    }
-
     /**
      * @param val Value to check.
      * @return {@code True} if {@code val} instance of binary Enum object.
@@ -2733,23 +2284,6 @@ public class BinaryUtils {
         return binariesFactory.reader(ctx, in, ldr, forUnmarshal);
     }
 
-    /**
-     * Creates reader instance.
-     *
-     * @param ctx Context.
-     * @param in Input stream.
-     * @param ldr Class loader.
-     * @param reader BinaryReaderEx.
-     * @param forUnmarshal {@code True} if reader is need to unmarshal object.
-     */
-    public static BinaryReaderEx reader(BinaryContext ctx,
-        BinaryInputStream in,
-        ClassLoader ldr,
-        BinaryReaderEx reader,
-        boolean forUnmarshal) {
-        return reader(ctx, in, ldr, reader.handles(), forUnmarshal);
-    }
-
     /**
      * Creates reader instance.
      *
@@ -2891,45 +2425,6 @@ public class BinaryUtils {
         return ((BinaryObjectExImpl)obj).field(fieldId);
     }
 
-    /**
-     * Check for arrays equality.
-     *
-     * @param a1 Value 1.
-     * @param a2 Value 2.
-     * @return {@code True} if arrays equal.
-     */
-    public static boolean arrayEq(Object a1, Object a2) {
-        if (a1 == a2)
-            return true;
-
-        if (a1 == null || a2 == null)
-            return a1 != null || a2 != null;
-
-        if (a1.getClass() != a2.getClass())
-            return false;
-
-        if (a1 instanceof byte[])
-            return Arrays.equals((byte[])a1, (byte[])a2);
-        else if (a1 instanceof boolean[])
-            return Arrays.equals((boolean[])a1, (boolean[])a2);
-        else if (a1 instanceof short[])
-            return Arrays.equals((short[])a1, (short[])a2);
-        else if (a1 instanceof char[])
-            return Arrays.equals((char[])a1, (char[])a2);
-        else if (a1 instanceof int[])
-            return Arrays.equals((int[])a1, (int[])a2);
-        else if (a1 instanceof long[])
-            return Arrays.equals((long[])a1, (long[])a2);
-        else if (a1 instanceof float[])
-            return Arrays.equals((float[])a1, (float[])a2);
-        else if (a1 instanceof double[])
-            return Arrays.equals((double[])a1, (double[])a2);
-        else if (isBinaryArray(a1))
-            return a1.equals(a2);
-
-        return Arrays.deepEquals((Object[])a1, (Object[])a2);
-    }
-
     /**
      * @param o Object to detach.
      * @return Detached object.
@@ -2955,16 +2450,6 @@ public class BinaryUtils {
         return F.viewReadOnly(meta.schemas(), s -> new T2<>(s.schemaId(), 
s.fieldIds()));
     }
 
-    /**
-     * Gets field by its order.
-     *
-     * @param reader Reader.
-     * @param order Order.
-     */
-    public static int fieldId(BinaryReaderEx reader, int order) {
-        return reader.getOrCreateSchema().fieldId(order);
-    }
-
     /**
      * @param obj Value.
      * @return {@code True} if object is of known immutable type.
@@ -3000,16 +2485,6 @@ public class BinaryUtils {
         return new BinaryMetadata(typeId, typeName, fields, affKeyFieldName, 
schemas, isEnum, enumMap);
     }
 
-    /** */
-    public static int hashCode(byte[] data, int startPos, int endPos) {
-        int hash = 1;
-
-        for (int i = startPos; i < endPos; i++)
-            hash = 31 * hash + data[i];
-
-        return hash;
-    }
-
     /**
      * Enum type.
      */
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java
index 86109b19b62..3603a98c7bb 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java
@@ -57,7 +57,7 @@ class BinaryArrayIdentityResolver extends 
BinaryAbstractIdentityResolver {
             int end = ex.footerStartOffset();
 
             if (ex.hasBytes())
-                return BinaryUtils.hashCode(ex.bytes(), start, end);
+                return BinaryImplUtils.hashCode(ex.bytes(), start, end);
             else {
                 // Handle offheap object.
                 int hash = 1;
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java
new file mode 100644
index 00000000000..6d59f0519b5
--- /dev/null
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java
@@ -0,0 +1,520 @@
+/*
+ * 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.binary;
+
+import java.math.BigDecimal;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.UUID;
+import org.apache.ignite.internal.binary.streams.BinaryInputStream;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.lang.IgniteBiTuple;
+
+import static 
org.apache.ignite.internal.binary.BinaryUtils.PLAIN_CLASS_TO_FLAG;
+import static org.apache.ignite.internal.binary.BinaryUtils.length;
+
+/**
+ * Binary utils used only in implementation.
+ */
+public class BinaryImplUtils {
+    /** Flag: user type. */
+    static final short FLAG_USR_TYP = 0x0001;
+
+    /** Flag: only raw data exists. */
+    static final short FLAG_HAS_SCHEMA = 0x0002;
+
+    /** Flag indicating that object has raw data. */
+    static final short FLAG_HAS_RAW = 0x0004;
+
+    /** Flag: offsets take 1 byte. */
+    static final short FLAG_OFFSET_ONE_BYTE = 0x0008;
+
+    /** Flag: offsets take 2 bytes. */
+    static final short FLAG_OFFSET_TWO_BYTES = 0x0010;
+
+    /** Flag: compact footer, no field IDs. */
+    public static final short FLAG_COMPACT_FOOTER = 0x0020;
+
+    /** Flag: raw data contains .NET type information. Always 0 in Java. Keep 
it here for information only. */
+    @SuppressWarnings("unused")
+    public static final short FLAG_CUSTOM_DOTNET_TYPE = 0x0040;
+
+    /** Offset which fits into 1 byte. */
+    static final int OFFSET_1 = 1;
+
+    /** Offset which fits into 2 bytes. */
+    static final int OFFSET_2 = 2;
+
+    /** Offset which fits into 4 bytes. */
+    static final int OFFSET_4 = 4;
+
+    /** Field ID length. */
+    static final int FIELD_ID_LEN = 4;
+
+    /** {@code true} if serialized value of this type cannot contain 
references to objects. */
+    private static final boolean[] PLAIN_TYPE_FLAG = new boolean[102];
+
+    static {
+        for (byte b : new byte[] {
+            GridBinaryMarshaller.BYTE, GridBinaryMarshaller.SHORT, 
GridBinaryMarshaller.INT, GridBinaryMarshaller.LONG,
+            GridBinaryMarshaller.FLOAT, GridBinaryMarshaller.DOUBLE, 
GridBinaryMarshaller.CHAR, GridBinaryMarshaller.BOOLEAN,
+            GridBinaryMarshaller.DECIMAL, GridBinaryMarshaller.STRING, 
GridBinaryMarshaller.UUID, GridBinaryMarshaller.DATE,
+            GridBinaryMarshaller.TIMESTAMP, GridBinaryMarshaller.TIME, 
GridBinaryMarshaller.BYTE_ARR, GridBinaryMarshaller.SHORT_ARR,
+            GridBinaryMarshaller.INT_ARR, GridBinaryMarshaller.LONG_ARR, 
GridBinaryMarshaller.FLOAT_ARR, GridBinaryMarshaller.DOUBLE_ARR,
+            GridBinaryMarshaller.TIME_ARR, GridBinaryMarshaller.CHAR_ARR, 
GridBinaryMarshaller.BOOLEAN_ARR,
+            GridBinaryMarshaller.DECIMAL_ARR, GridBinaryMarshaller.STRING_ARR, 
GridBinaryMarshaller.UUID_ARR, GridBinaryMarshaller.DATE_ARR,
+            GridBinaryMarshaller.TIMESTAMP_ARR, GridBinaryMarshaller.ENUM, 
GridBinaryMarshaller.ENUM_ARR, GridBinaryMarshaller.NULL}) {
+
+            PLAIN_TYPE_FLAG[b] = true;
+        }
+    }
+
+    /**
+     * Check if user type flag is set.
+     *
+     * @param flags Flags.
+     * @return {@code True} if set.
+     */
+    static boolean isUserType(short flags) {
+        return isFlagSet(flags, FLAG_USR_TYP);
+    }
+
+    /**
+     * Check if raw-only flag is set.
+     *
+     * @param flags Flags.
+     * @return {@code True} if set.
+     */
+    public static boolean hasSchema(short flags) {
+        return isFlagSet(flags, FLAG_HAS_SCHEMA);
+    }
+
+    /**
+     * Check if raw-only flag is set.
+     *
+     * @param flags Flags.
+     * @return {@code True} if set.
+     */
+    static boolean hasRaw(short flags) {
+        return isFlagSet(flags, FLAG_HAS_RAW);
+    }
+
+    /**
+     * Check if "no-field-ids" flag is set.
+     *
+     * @param flags Flags.
+     * @return {@code True} if set.
+     */
+    static boolean isCompactFooter(short flags) {
+        return isFlagSet(flags, FLAG_COMPACT_FOOTER);
+    }
+
+    /**
+     * Check whether particular flag is set.
+     *
+     * @param flags Flags.
+     * @param flag Flag.
+     * @return {@code True} if flag is set in flags.
+     */
+    static boolean isFlagSet(short flags, short flag) {
+        return (flags & flag) == flag;
+    }
+
+    /** */
+    static int dataStartRelative(BinaryPositionReadable in, int start) {
+        int typeId = in.readIntPositioned(start + 
GridBinaryMarshaller.TYPE_ID_POS);
+
+        if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) {
+            // Gets the length of the type name which is stored as string.
+            int len = in.readIntPositioned(start + 
GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1);
+
+            return GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1 + 
/** string length */ 4 + len;
+        }
+        else
+            return GridBinaryMarshaller.DFLT_HDR_LEN;
+    }
+
+    /**
+     * Get footer start of the object.
+     *
+     * @param in Input stream.
+     * @param start Object start position inside the stream.
+     * @return Footer start.
+     */
+    private static int footerStartRelative(BinaryPositionReadable in, int 
start) {
+        short flags = in.readShortPositioned(start + 
GridBinaryMarshaller.FLAGS_POS);
+
+        if (hasSchema(flags))
+            // Schema exists, use offset.
+            return in.readIntPositioned(start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
+        else
+            // No schema, footer start equals to object end.
+            return length(in, start);
+    }
+
+    /**
+     * Get object's footer.
+     *
+     * @param in Input stream.
+     * @param start Start position.
+     * @return Footer start.
+     */
+    public static int footerStartAbsolute(BinaryPositionReadable in, int 
start) {
+        return footerStartRelative(in, start) + start;
+    }
+
+    /**
+     * Get object's footer.
+     *
+     * @param in Input stream.
+     * @param start Start position.
+     * @return Footer.
+     */
+    public static IgniteBiTuple<Integer, Integer> 
footerAbsolute(BinaryPositionReadable in, int start) {
+        short flags = in.readShortPositioned(start + 
GridBinaryMarshaller.FLAGS_POS);
+
+        int footerEnd = length(in, start);
+
+        if (hasSchema(flags)) {
+            // Schema exists.
+            int footerStart = in.readIntPositioned(start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
+
+            if (hasRaw(flags))
+                footerEnd -= 4;
+
+            assert footerStart <= footerEnd;
+
+            return F.t(start + footerStart, start + footerEnd);
+        }
+        else
+            // No schema.
+            return F.t(start + footerEnd, start + footerEnd);
+    }
+
+    /**
+     * Get relative raw offset of the object.
+     *
+     * @param in Input stream.
+     * @param start Object start position inside the stream.
+     * @return Raw offset.
+     */
+    private static int rawOffsetRelative(BinaryPositionReadable in, int start) 
{
+        short flags = in.readShortPositioned(start + 
GridBinaryMarshaller.FLAGS_POS);
+
+        int len = length(in, start);
+
+        if (hasSchema(flags)) {
+            // Schema exists.
+            if (hasRaw(flags))
+                // Raw offset is set, it is at the very end of the object.
+                return in.readIntPositioned(start + len - 4);
+            else
+                // Raw offset is not set, so just return schema offset.
+                return in.readIntPositioned(start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
+        }
+        else
+            // No schema, raw offset is located on schema offset position.
+            return in.readIntPositioned(start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
+    }
+
+    /**
+     * Get absolute raw offset of the object.
+     *
+     * @param in Input stream.
+     * @param start Object start position inside the stream.
+     * @return Raw offset.
+     */
+    public static int rawOffsetAbsolute(BinaryPositionReadable in, int start) {
+        return start + rawOffsetRelative(in, start);
+    }
+
+    /**
+     * Get offset length for the given flags.
+     *
+     * @param flags Flags.
+     * @return Offset size.
+     */
+    public static int fieldOffsetLength(short flags) {
+        if ((flags & FLAG_OFFSET_ONE_BYTE) == FLAG_OFFSET_ONE_BYTE)
+            return OFFSET_1;
+        else if ((flags & FLAG_OFFSET_TWO_BYTES) == FLAG_OFFSET_TWO_BYTES)
+            return OFFSET_2;
+        else
+            return OFFSET_4;
+    }
+
+    /**
+     * Get field ID length.
+     *
+     * @param flags Flags.
+     * @return Field ID length.
+     */
+    public static int fieldIdLength(short flags) {
+        return isCompactFooter(flags) ? 0 : FIELD_ID_LEN;
+    }
+
+    /**
+     * Get relative field offset.
+     *
+     * @param stream Stream.
+     * @param pos Position.
+     * @param fieldOffsetSize Field offset size.
+     * @return Relative field offset.
+     */
+    public static int fieldOffsetRelative(BinaryPositionReadable stream, int 
pos, int fieldOffsetSize) {
+        int res;
+
+        if (fieldOffsetSize == OFFSET_1)
+            res = (int)stream.readBytePositioned(pos) & 0xFF;
+        else if (fieldOffsetSize == OFFSET_2)
+            res = (int)stream.readShortPositioned(pos) & 0xFFFF;
+        else
+            res = stream.readIntPositioned(pos);
+
+        return res;
+    }
+
+    /**
+     * @return {@code true} if content of serialized value cannot contain 
references to other object.
+     */
+    public static boolean isPlainType(int type) {
+        return type > 0 && type < PLAIN_TYPE_FLAG.length && 
PLAIN_TYPE_FLAG[type];
+    }
+
+    /**
+     * Checks whether an array type values can or can not contain references 
to other object.
+     *
+     * @param type Array type.
+     * @return {@code true} if content of serialized array value cannot 
contain references to other object.
+     */
+    public static boolean isPlainArrayType(int type) {
+        return (type >= GridBinaryMarshaller.BYTE_ARR && type <= 
GridBinaryMarshaller.DATE_ARR)
+            || type == GridBinaryMarshaller.TIMESTAMP_ARR || type == 
GridBinaryMarshaller.TIME_ARR;
+    }
+
+    /**
+     * Write value with flag. e.g. writePlainObject(writer, (byte)77) will 
write two byte: {BYTE, 77}.
+     *
+     * @param writer W
+     * @param val Value.
+     */
+    public static void writePlainObject(BinaryWriterEx writer, Object val) {
+        Byte flag = PLAIN_CLASS_TO_FLAG.get(val.getClass());
+
+        if (flag == null)
+            throw new IllegalArgumentException("Can't write object with type: 
" + val.getClass());
+
+        switch (flag) {
+            case GridBinaryMarshaller.BYTE:
+                writer.writeByte(flag);
+                writer.writeByte((Byte)val);
+
+                break;
+
+            case GridBinaryMarshaller.SHORT:
+                writer.writeByte(flag);
+                writer.writeShort((Short)val);
+
+                break;
+
+            case GridBinaryMarshaller.INT:
+                writer.writeByte(flag);
+                writer.writeInt((Integer)val);
+
+                break;
+
+            case GridBinaryMarshaller.LONG:
+                writer.writeByte(flag);
+                writer.writeLong((Long)val);
+
+                break;
+
+            case GridBinaryMarshaller.FLOAT:
+                writer.writeByte(flag);
+                writer.writeFloat((Float)val);
+
+                break;
+
+            case GridBinaryMarshaller.DOUBLE:
+                writer.writeByte(flag);
+                writer.writeDouble((Double)val);
+
+                break;
+
+            case GridBinaryMarshaller.CHAR:
+                writer.writeByte(flag);
+                writer.writeChar((Character)val);
+
+                break;
+
+            case GridBinaryMarshaller.BOOLEAN:
+                writer.writeByte(flag);
+                writer.writeBoolean((Boolean)val);
+
+                break;
+
+            case GridBinaryMarshaller.DECIMAL:
+                writer.writeDecimal((BigDecimal)val);
+
+                break;
+
+            case GridBinaryMarshaller.STRING:
+                writer.writeString((String)val);
+
+                break;
+
+            case GridBinaryMarshaller.UUID:
+                writer.writeUuid((UUID)val);
+
+                break;
+
+            case GridBinaryMarshaller.DATE:
+                writer.writeDate((Date)val);
+
+                break;
+
+            case GridBinaryMarshaller.TIMESTAMP:
+                writer.writeTimestamp((Timestamp)val);
+
+                break;
+
+            case GridBinaryMarshaller.TIME:
+                writer.writeTime((Time)val);
+
+                break;
+
+            case GridBinaryMarshaller.BYTE_ARR:
+                writer.writeByteArray((byte[])val);
+
+                break;
+
+            case GridBinaryMarshaller.SHORT_ARR:
+                writer.writeShortArray((short[])val);
+
+                break;
+
+            case GridBinaryMarshaller.INT_ARR:
+                writer.writeIntArray((int[])val);
+
+                break;
+
+            case GridBinaryMarshaller.LONG_ARR:
+                writer.writeLongArray((long[])val);
+
+                break;
+
+            case GridBinaryMarshaller.FLOAT_ARR:
+                writer.writeFloatArray((float[])val);
+
+                break;
+
+            case GridBinaryMarshaller.DOUBLE_ARR:
+                writer.writeDoubleArray((double[])val);
+
+                break;
+
+            case GridBinaryMarshaller.CHAR_ARR:
+                writer.writeCharArray((char[])val);
+
+                break;
+
+            case GridBinaryMarshaller.BOOLEAN_ARR:
+                writer.writeBooleanArray((boolean[])val);
+
+                break;
+
+            case GridBinaryMarshaller.DECIMAL_ARR:
+                writer.writeDecimalArray((BigDecimal[])val);
+
+                break;
+
+            case GridBinaryMarshaller.STRING_ARR:
+                writer.writeStringArray((String[])val);
+
+                break;
+
+            case GridBinaryMarshaller.UUID_ARR:
+                writer.writeUuidArray((UUID[])val);
+
+                break;
+
+            case GridBinaryMarshaller.DATE_ARR:
+                writer.writeDateArray((Date[])val);
+
+                break;
+
+            case GridBinaryMarshaller.TIMESTAMP_ARR:
+                writer.writeTimestampArray((Timestamp[])val);
+
+                break;
+
+            case GridBinaryMarshaller.TIME_ARR:
+                writer.writeTimeArray((Time[])val);
+
+                break;
+
+            default:
+                throw new IllegalArgumentException("Can't write object with 
type: " + val.getClass());
+        }
+    }
+
+    /**
+     * @param val Value to check.
+     * @return {@code True} if {@code val} instance of {@link BinaryEnumArray}.
+     */
+    public static boolean isBinaryEnumArray(Object val) {
+        return val instanceof BinaryEnumArray;
+    }
+
+    /**
+     * Gets field by its order.
+     *
+     * @param reader Reader.
+     * @param order Order.
+     */
+    public static int fieldId(BinaryReaderEx reader, int order) {
+        return reader.getOrCreateSchema().fieldId(order);
+    }
+
+    /** */
+    public static int hashCode(byte[] data, int startPos, int endPos) {
+        int hash = 1;
+
+        for (int i = startPos; i < endPos; i++)
+            hash = 31 * hash + data[i];
+
+        return hash;
+    }
+
+    /**
+     * Creates reader instance.
+     *
+     * @param ctx Context.
+     * @param in Input stream.
+     * @param ldr Class loader.
+     * @param reader BinaryReaderEx.
+     * @param forUnmarshal {@code True} if reader is need to unmarshal object.
+     */
+    public static BinaryReaderEx reader(BinaryContext ctx,
+                                        BinaryInputStream in,
+                                        ClassLoader ldr,
+                                        BinaryReaderEx reader,
+                                        boolean forUnmarshal) {
+        return BinaryUtils.binariesFactory.reader(ctx, in, ldr, 
reader.handles(), forUnmarshal);
+    }
+}
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
index 7dd2bebdf86..d41d6a3160d 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java
@@ -45,6 +45,7 @@ import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.Nullable;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_COMPACT_FOOTER;
 import static 
org.apache.ignite.internal.binary.GridBinaryMarshaller.TRANSFORMED;
 
 /**
@@ -345,7 +346,12 @@ public final class BinaryObjectImpl extends 
BinaryObjectExImpl implements Extern
     @Override public boolean isFlagSet(short flag) {
         short flags = BinaryPrimitives.readShort(arr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        return BinaryUtils.isFlagSet(flags, flag);
+        return BinaryImplUtils.isFlagSet(flags, flag);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isCompactFooter() {
+        return isFlagSet(FLAG_COMPACT_FOOTER);
     }
 
     /** {@inheritDoc} */
@@ -406,7 +412,7 @@ public final class BinaryObjectImpl extends 
BinaryObjectExImpl implements Extern
     @Override public int footerStartOffset() {
         short flags = BinaryPrimitives.readShort(arr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        if (!BinaryUtils.hasSchema(flags))
+        if (!BinaryImplUtils.hasSchema(flags))
             return start + length();
 
         return start + BinaryPrimitives.readInt(arr, start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
@@ -424,16 +430,16 @@ public final class BinaryObjectImpl extends 
BinaryObjectExImpl implements Extern
 
         short flags = BinaryPrimitives.readShort(arr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : 
BinaryUtils.FIELD_ID_LEN;
-        int fieldOffLen = BinaryUtils.fieldOffsetLength(flags);
+        int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : 
BinaryImplUtils.FIELD_ID_LEN;
+        int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags);
 
         int fieldOffsetPos = start + schemaOff + order * (fieldIdLen + 
fieldOffLen) + fieldIdLen;
 
         int fieldPos;
 
-        if (fieldOffLen == BinaryUtils.OFFSET_1)
+        if (fieldOffLen == BinaryImplUtils.OFFSET_1)
             fieldPos = start + ((int)BinaryPrimitives.readByte(arr, 
fieldOffsetPos) & 0xFF);
-        else if (fieldOffLen == BinaryUtils.OFFSET_2)
+        else if (fieldOffLen == BinaryImplUtils.OFFSET_2)
             fieldPos = start + ((int)BinaryPrimitives.readShort(arr, 
fieldOffsetPos) & 0xFFFF);
         else
             fieldPos = start + BinaryPrimitives.readInt(arr, fieldOffsetPos);
@@ -570,16 +576,16 @@ public final class BinaryObjectImpl extends 
BinaryObjectExImpl implements Extern
 
         short flags = BinaryPrimitives.readShort(arr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : 
BinaryUtils.FIELD_ID_LEN;
-        int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags);
+        int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : 
BinaryImplUtils.FIELD_ID_LEN;
+        int fieldOffsetLen = BinaryImplUtils.fieldOffsetLength(flags);
 
         int fieldOffsetPos = start + schemaOffset + order * (fieldIdLen + 
fieldOffsetLen) + fieldIdLen;
 
         int fieldPos;
 
-        if (fieldOffsetLen == BinaryUtils.OFFSET_1)
+        if (fieldOffsetLen == BinaryImplUtils.OFFSET_1)
             fieldPos = start + ((int)BinaryPrimitives.readByte(arr, 
fieldOffsetPos) & 0xFF);
-        else if (fieldOffsetLen == BinaryUtils.OFFSET_2)
+        else if (fieldOffsetLen == BinaryImplUtils.OFFSET_2)
             fieldPos = start + ((int)BinaryPrimitives.readShort(arr, 
fieldOffsetPos) & 0xFFFF);
         else
             fieldPos = start + BinaryPrimitives.readInt(arr, fieldOffsetPos);
@@ -728,7 +734,7 @@ public final class BinaryObjectImpl extends 
BinaryObjectExImpl implements Extern
     @Override public boolean hasSchema() {
         short flags = BinaryPrimitives.readShort(arr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        return BinaryUtils.hasSchema(flags);
+        return BinaryImplUtils.hasSchema(flags);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
index e2ac1b89b4e..9ad6c06a605 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java
@@ -43,6 +43,7 @@ import org.apache.ignite.marshaller.Marshallers;
 import org.jetbrains.annotations.Nullable;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_COMPACT_FOOTER;
 
 /**
  *  Binary object implementation over offheap memory
@@ -117,7 +118,7 @@ class BinaryObjectOffheapImpl extends BinaryObjectExImpl 
implements Externalizab
     @Override public boolean hasSchema() {
         short flags = BinaryPrimitives.readShort(ptr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        return BinaryUtils.hasSchema(flags);
+        return BinaryImplUtils.hasSchema(flags);
     }
 
     /** {@inheritDoc} */
@@ -175,7 +176,12 @@ class BinaryObjectOffheapImpl extends BinaryObjectExImpl 
implements Externalizab
     @Override public boolean isFlagSet(short flag) {
         short flags = BinaryPrimitives.readShort(ptr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        return BinaryUtils.isFlagSet(flags, flag);
+        return BinaryImplUtils.isFlagSet(flags, flag);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isCompactFooter() {
+        return isFlagSet(FLAG_COMPACT_FOOTER);
     }
 
     /** {@inheritDoc} */
@@ -215,7 +221,7 @@ class BinaryObjectOffheapImpl extends BinaryObjectExImpl 
implements Externalizab
     @Override public int footerStartOffset() {
         short flags = BinaryPrimitives.readShort(ptr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        if (!BinaryUtils.hasSchema(flags))
+        if (!BinaryImplUtils.hasSchema(flags))
             return start + length();
 
         return start + BinaryPrimitives.readInt(ptr, start + 
GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS);
@@ -233,16 +239,16 @@ class BinaryObjectOffheapImpl extends BinaryObjectExImpl 
implements Externalizab
 
         short flags = BinaryPrimitives.readShort(ptr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : 
BinaryUtils.FIELD_ID_LEN;
-        int fieldOffLen = BinaryUtils.fieldOffsetLength(flags);
+        int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : 
BinaryImplUtils.FIELD_ID_LEN;
+        int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags);
 
         int fieldOffsetPos = start + schemaOff + order * (fieldIdLen + 
fieldOffLen) + fieldIdLen;
 
         int fieldPos;
 
-        if (fieldOffLen == BinaryUtils.OFFSET_1)
+        if (fieldOffLen == BinaryImplUtils.OFFSET_1)
             fieldPos = start + ((int)BinaryPrimitives.readByte(ptr, 
fieldOffsetPos) & 0xFF);
-        else if (fieldOffLen == BinaryUtils.OFFSET_2)
+        else if (fieldOffLen == BinaryImplUtils.OFFSET_2)
             fieldPos = start + ((int)BinaryPrimitives.readShort(ptr, 
fieldOffsetPos) & 0xFFFF);
         else
             fieldPos = start + BinaryPrimitives.readInt(ptr, fieldOffsetPos);
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
index 2ab4ef2ca8b..8b0fe48dbb3 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java
@@ -235,16 +235,16 @@ class BinaryReaderExImpl implements BinaryReaderEx {
             int offset = in.readInt();
 
             // Get trivial flag values.
-            userType = BinaryUtils.isUserType(flags);
-            fieldIdLen = BinaryUtils.fieldIdLength(flags);
-            fieldOffLen = BinaryUtils.fieldOffsetLength(flags);
+            userType = BinaryImplUtils.isUserType(flags);
+            fieldIdLen = BinaryImplUtils.fieldIdLength(flags);
+            fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags);
 
             // Calculate footer borders and raw offset.
-            if (BinaryUtils.hasSchema(flags)) {
+            if (BinaryImplUtils.hasSchema(flags)) {
                 // Schema exists.
                 footerStart = start + offset;
 
-                if (BinaryUtils.hasRaw(flags)) {
+                if (BinaryImplUtils.hasRaw(flags)) {
                     footerLen = len - offset;
                     rawOff = start + in.readIntPositioned(start + len - 4);
                 }
@@ -258,7 +258,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
                 footerStart = start + len;
                 footerLen = 0;
 
-                if (BinaryUtils.hasRaw(flags))
+                if (BinaryImplUtils.hasRaw(flags))
                     rawOff = start + offset;
                 else
                     rawOff = start + len;
@@ -288,7 +288,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
             }
 
             mapper = userType ? ctx.userTypeMapper(typeId) : 
BinaryContext.defaultMapper();
-            schema = BinaryUtils.hasSchema(flags) ? getOrCreateSchema() : null;
+            schema = BinaryImplUtils.hasSchema(flags) ? getOrCreateSchema() : 
null;
         }
         else {
             dataStart = 0;
@@ -374,11 +374,6 @@ class BinaryReaderExImpl implements BinaryReaderEx {
         return null;
     }
 
-    /** {@inheritDoc} */
-    @Override public void setHandle(Object obj) {
-        setHandle(obj, start);
-    }
-
     /** {@inheritDoc} */
     @Override public void setHandle(Object obj, int pos) {
         handles().put(pos, obj);
@@ -1991,7 +1986,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
         BinarySchema schema = ctx.schemaRegistry(typeId).schema(schemaId);
 
         if (schema == null) {
-            if (fieldIdLen != BinaryUtils.FIELD_ID_LEN) {
+            if (fieldIdLen != BinaryImplUtils.FIELD_ID_LEN) {
                 BinaryTypeImpl type = (BinaryTypeImpl)ctx.metadata(typeId, 
schemaId);
 
                 BinaryMetadata meta = type != null ? type.metadata() : null;
@@ -2043,7 +2038,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
      * @return Schema.
      */
     private BinarySchema createSchema() {
-        assert fieldIdLen == BinaryUtils.FIELD_ID_LEN;
+        assert fieldIdLen == BinaryImplUtils.FIELD_ID_LEN;
 
         BinarySchema.Builder builder = BinarySchema.Builder.newBuilder();
 
@@ -2055,7 +2050,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
 
             builder.addField(fieldId);
 
-            searchPos += BinaryUtils.FIELD_ID_LEN + fieldOffLen;
+            searchPos += BinaryImplUtils.FIELD_ID_LEN + fieldOffLen;
         }
 
         return builder.build();
@@ -2186,7 +2181,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
         if (order != BinarySchema.ORDER_NOT_FOUND) {
             int offsetPos = footerStart + order * (fieldIdLen + fieldOffLen) + 
fieldIdLen;
 
-            int pos = start + BinaryUtils.fieldOffsetRelative(in, offsetPos, 
fieldOffLen);
+            int pos = start + BinaryImplUtils.fieldOffsetRelative(in, 
offsetPos, fieldOffLen);
 
             streamPosition(pos);
 
@@ -2204,7 +2199,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
      */
     private boolean trySetSystemFieldPosition(int id) {
         // System types are never written with compact footers because they do 
not have metadata.
-        assert fieldIdLen == BinaryUtils.FIELD_ID_LEN;
+        assert fieldIdLen == BinaryImplUtils.FIELD_ID_LEN;
 
         int searchPos = footerStart;
         int searchTail = searchPos + footerLen;
@@ -2216,7 +2211,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
             int id0 = in.readIntPositioned(searchPos);
 
             if (id0 == id) {
-                int pos = start + BinaryUtils.fieldOffsetRelative(in, 
searchPos + BinaryUtils.FIELD_ID_LEN,
+                int pos = start + BinaryImplUtils.fieldOffsetRelative(in, 
searchPos + BinaryImplUtils.FIELD_ID_LEN,
                     fieldOffLen);
 
                 streamPosition(pos);
@@ -2224,7 +2219,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
                 return true;
             }
 
-            searchPos += BinaryUtils.FIELD_ID_LEN + fieldOffLen;
+            searchPos += BinaryImplUtils.FIELD_ID_LEN + fieldOffLen;
         }
     }
 
@@ -2375,7 +2370,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
                 case BINARY:
                     res = newInstance(desc.ctor(), desc.describedClass());
 
-                    setHandle(res);
+                    setHandle(res, start);
 
                     if (desc.serializer != null)
                         desc.serializer.readBinary(res, this);
@@ -2387,7 +2382,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
                 case OBJECT:
                     res = newInstance(desc.ctor(), desc.describedClass());
 
-                    setHandle(res);
+                    setHandle(res, start);
 
                     for (BinaryFieldDescriptor info : desc.fields)
                         readField(res, info);
@@ -2404,7 +2399,7 @@ class BinaryReaderExImpl implements BinaryReaderEx {
                 try {
                     res = desc.readResolveMtd.invoke(res);
 
-                    setHandle(res);
+                    setHandle(res, start);
                 }
                 catch (IllegalAccessException e) {
                     throw new RuntimeException(e);
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java
index 9f36b6d7489..edea8d3699b 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java
@@ -246,11 +246,11 @@ class BinaryWriterExImpl implements BinaryWriterEx {
 
         if (userType) {
             if (ctx.isCompactFooter()) {
-                flags = BinaryUtils.FLAG_USR_TYP | 
BinaryUtils.FLAG_COMPACT_FOOTER;
+                flags = BinaryImplUtils.FLAG_USR_TYP | 
BinaryImplUtils.FLAG_COMPACT_FOOTER;
                 useCompactFooter = true;
             }
             else {
-                flags = BinaryUtils.FLAG_USR_TYP;
+                flags = BinaryImplUtils.FLAG_USR_TYP;
                 useCompactFooter = false;
             }
         }
@@ -265,18 +265,18 @@ class BinaryWriterExImpl implements BinaryWriterEx {
             offset = out.position() - start;
 
             // Write the schema.
-            flags |= BinaryUtils.FLAG_HAS_SCHEMA;
+            flags |= BinaryImplUtils.FLAG_HAS_SCHEMA;
 
             int offsetByteCnt = schema.write(out, fieldCnt, useCompactFooter);
 
-            if (offsetByteCnt == BinaryUtils.OFFSET_1)
-                flags |= BinaryUtils.FLAG_OFFSET_ONE_BYTE;
-            else if (offsetByteCnt == BinaryUtils.OFFSET_2)
-                flags |= BinaryUtils.FLAG_OFFSET_TWO_BYTES;
+            if (offsetByteCnt == BinaryImplUtils.OFFSET_1)
+                flags |= BinaryImplUtils.FLAG_OFFSET_ONE_BYTE;
+            else if (offsetByteCnt == BinaryImplUtils.OFFSET_2)
+                flags |= BinaryImplUtils.FLAG_OFFSET_TWO_BYTES;
 
             // Write raw offset if needed.
             if (rawOffPos != 0) {
-                flags |= BinaryUtils.FLAG_HAS_RAW;
+                flags |= BinaryImplUtils.FLAG_HAS_RAW;
 
                 out.writeInt(rawOffPos - start);
             }
@@ -286,7 +286,7 @@ class BinaryWriterExImpl implements BinaryWriterEx {
                 offset = rawOffPos - start;
 
                 // If there is no schema, we are free to write raw offset to 
schema offset.
-                flags |= BinaryUtils.FLAG_HAS_RAW;
+                flags |= BinaryImplUtils.FLAG_HAS_RAW;
             }
             else
                 offset = GridBinaryMarshaller.DFLT_HDR_LEN;
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java
index cd2d8c5d761..fecb10aa239 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java
@@ -96,19 +96,19 @@ class BinaryWriterSchemaHolder {
                 for (int curIdx = startIdx + 1; curIdx < idx; curIdx += 2)
                     out.unsafeWriteByte((byte)data[curIdx]);
 
-                res = BinaryUtils.OFFSET_1;
+                res = BinaryImplUtils.OFFSET_1;
             }
             else if (lastOffset < MAX_OFFSET_2) {
                 for (int curIdx = startIdx + 1; curIdx < idx; curIdx += 2)
                     out.unsafeWriteShort((short)data[curIdx]);
 
-                res = BinaryUtils.OFFSET_2;
+                res = BinaryImplUtils.OFFSET_2;
             }
             else {
                 for (int curIdx = startIdx + 1; curIdx < idx; curIdx += 2)
                     out.unsafeWriteInt(data[curIdx]);
 
-                res = BinaryUtils.OFFSET_4;
+                res = BinaryImplUtils.OFFSET_4;
             }
         }
         else {
@@ -118,7 +118,7 @@ class BinaryWriterSchemaHolder {
                     out.unsafeWriteByte((byte)data[curIdx++]);
                 }
 
-                res = BinaryUtils.OFFSET_1;
+                res = BinaryImplUtils.OFFSET_1;
             }
             else if (lastOffset < MAX_OFFSET_2) {
                 for (int curIdx = startIdx; curIdx < idx;) {
@@ -126,7 +126,7 @@ class BinaryWriterSchemaHolder {
                     out.unsafeWriteShort((short)data[curIdx++]);
                 }
 
-                res = BinaryUtils.OFFSET_2;
+                res = BinaryImplUtils.OFFSET_2;
             }
             else {
                 for (int curIdx = startIdx; curIdx < idx;) {
@@ -134,7 +134,7 @@ class BinaryWriterSchemaHolder {
                     out.unsafeWriteInt(data[curIdx++]);
                 }
 
-                res = BinaryUtils.OFFSET_4;
+                res = BinaryImplUtils.OFFSET_4;
             }
         }
 
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java
index 845f057fe8f..d5c06d7032e 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java
@@ -21,18 +21,18 @@ import java.util.HashMap;
 import java.util.Map;
 import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
 
-import static 
org.apache.ignite.internal.binary.BinaryUtils.FLAG_OFFSET_ONE_BYTE;
-import static 
org.apache.ignite.internal.binary.BinaryUtils.FLAG_OFFSET_TWO_BYTES;
-import static org.apache.ignite.internal.binary.BinaryUtils.OFFSET_1;
-import static org.apache.ignite.internal.binary.BinaryUtils.OFFSET_2;
-import static org.apache.ignite.internal.binary.BinaryUtils.dataStartRelative;
-import static org.apache.ignite.internal.binary.BinaryUtils.fieldOffsetLength;
-import static 
org.apache.ignite.internal.binary.BinaryUtils.footerStartAbsolute;
-import static org.apache.ignite.internal.binary.BinaryUtils.hasRaw;
-import static org.apache.ignite.internal.binary.BinaryUtils.hasSchema;
-import static org.apache.ignite.internal.binary.BinaryUtils.isCompactFooter;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_OFFSET_ONE_BYTE;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_OFFSET_TWO_BYTES;
+import static org.apache.ignite.internal.binary.BinaryImplUtils.OFFSET_1;
+import static org.apache.ignite.internal.binary.BinaryImplUtils.OFFSET_2;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.dataStartRelative;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.fieldOffsetLength;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.footerStartAbsolute;
+import static org.apache.ignite.internal.binary.BinaryImplUtils.hasRaw;
+import static org.apache.ignite.internal.binary.BinaryImplUtils.hasSchema;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.isCompactFooter;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.rawOffsetAbsolute;
 import static org.apache.ignite.internal.binary.BinaryUtils.length;
-import static org.apache.ignite.internal.binary.BinaryUtils.rawOffsetAbsolute;
 import static 
org.apache.ignite.internal.binary.GridBinaryMarshaller.DFLT_HDR_LEN;
 import static org.apache.ignite.internal.binary.GridBinaryMarshaller.FLAGS_POS;
 import static 
org.apache.ignite.internal.binary.GridBinaryMarshaller.HASH_CODE_POS;
@@ -188,7 +188,7 @@ class CrossObjectReferenceResolver {
             overrideHeader(
                 outObjStartPos,
                 /** flags */ setFieldOffsetFlag(inObjDesc.flags, 
footerFieldOffsetLen),
-                /** hash */ BinaryUtils.hashCode(out.array(), outObjStartPos + 
DFLT_HDR_LEN, outFooterStartPos),
+                /** hash */ BinaryImplUtils.hashCode(out.array(), 
outObjStartPos + DFLT_HDR_LEN, outFooterStartPos),
                 /** total length */ out.position() - outObjStartPos,
                 schemaOrRawOffsetPos
             );
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java
index 1c9edee42b1..d5e40860186 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java
@@ -21,9 +21,9 @@ import 
org.apache.ignite.internal.binary.streams.BinaryInputStream;
 import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
 import org.apache.ignite.internal.binary.streams.BinaryStreams;
 
-import static org.apache.ignite.internal.binary.BinaryUtils.dataStartRelative;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.dataStartRelative;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.rawOffsetAbsolute;
 import static org.apache.ignite.internal.binary.BinaryUtils.length;
-import static org.apache.ignite.internal.binary.BinaryUtils.rawOffsetAbsolute;
 
 /** */
 class ObjectDetachHelper {
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java
index cc5f6da0a1b..6f2a505f7b9 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
 import java.util.Map;
 import org.apache.ignite.binary.BinaryObjectException;
 import org.apache.ignite.internal.binary.BinaryContext;
+import org.apache.ignite.internal.binary.BinaryImplUtils;
 import org.apache.ignite.internal.binary.BinaryObjectEx;
 import org.apache.ignite.internal.binary.BinaryObjectImpl;
 import org.apache.ignite.internal.binary.BinaryPositionReadable;
@@ -87,7 +88,7 @@ class BinaryBuilderReader implements BinaryPositionReadable {
         this.arr = other.arr;
         this.pos = start;
 
-        reader = BinaryUtils.reader(ctx,
+        reader = BinaryImplUtils.reader(ctx,
             BinaryStreams.inputStream(arr, start),
             null,
             other.reader,
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
index c30f1daf9a9..f2e1926a30d 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java
@@ -22,6 +22,7 @@ import java.util.IdentityHashMap;
 import java.util.Map;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.internal.binary.BinariesFactoryImpl;
+import org.apache.ignite.internal.binary.BinaryImplUtils;
 import org.apache.ignite.internal.binary.BinaryObjectEx;
 import org.apache.ignite.internal.binary.BinaryUtils;
 import org.apache.ignite.internal.binary.BinaryWriterEx;
@@ -174,12 +175,12 @@ class BinaryBuilderSerializer {
         Byte flag = BinaryUtils.PLAIN_CLASS_TO_FLAG.get(val.getClass());
 
         if (flag != null) {
-            BinaryUtils.writePlainObject(writer, val);
+            BinaryImplUtils.writePlainObject(writer, val);
 
             return;
         }
 
-        if (BinaryUtils.isBinaryEnumArray(val)) {
+        if (BinaryImplUtils.isBinaryEnumArray(val)) {
             BinaryObjectEx val0 = (BinaryObjectEx)val;
 
             if (val0.componentTypeId() == 
GridBinaryMarshaller.UNREGISTERED_TYPE_ID)
diff --git 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
index 65c31228303..33d372f3741 100644
--- 
a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
+++ 
b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java
@@ -33,6 +33,7 @@ import org.apache.ignite.binary.BinaryType;
 import org.apache.ignite.internal.binary.BinariesFactoryImpl;
 import org.apache.ignite.internal.binary.BinaryContext;
 import org.apache.ignite.internal.binary.BinaryFieldMetadata;
+import org.apache.ignite.internal.binary.BinaryImplUtils;
 import org.apache.ignite.internal.binary.BinaryObjectEx;
 import org.apache.ignite.internal.binary.BinaryObjectImpl;
 import org.apache.ignite.internal.binary.BinaryUtils;
@@ -207,7 +208,7 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
 
             Map<String, BinaryFieldMetadata> fieldsMeta = null;
 
-            if (reader != null && BinaryUtils.hasSchema(flags)) {
+            if (reader != null && BinaryImplUtils.hasSchema(flags)) {
                 Map<Integer, Object> assignedFldsById;
 
                 if (assignedVals != null) {
@@ -231,16 +232,16 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
                     assignedFldsById = Collections.emptyMap();
 
                 // Get footer details.
-                int fieldIdLen = BinaryUtils.fieldIdLength(flags);
-                int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags);
+                int fieldIdLen = BinaryImplUtils.fieldIdLength(flags);
+                int fieldOffsetLen = BinaryImplUtils.fieldOffsetLength(flags);
 
-                IgniteBiTuple<Integer, Integer> footer = 
BinaryUtils.footerAbsolute(reader, start);
+                IgniteBiTuple<Integer, Integer> footer = 
BinaryImplUtils.footerAbsolute(reader, start);
 
                 int footerPos = footer.get1();
                 int footerEnd = footer.get2();
 
                 // Get raw position.
-                int rawPos = BinaryUtils.rawOffsetAbsolute(reader, start);
+                int rawPos = BinaryImplUtils.rawOffsetAbsolute(reader, start);
 
                 // Position reader on data.
                 reader.position(start + hdrLen);
@@ -248,7 +249,7 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
                 int idx = 0;
 
                 while (reader.position() < rawPos) {
-                    int fieldId = BinaryUtils.fieldId(reader.reader(), idx++);
+                    int fieldId = BinaryImplUtils.fieldId(reader.reader(), 
idx++);
                     int fieldLen =
                         fieldPositionAndLength(footerPos, footerEnd, rawPos, 
fieldIdLen, fieldOffsetLen).get2();
 
@@ -268,7 +269,7 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
                     else {
                         int type = fieldLen != 0 ? reader.readByte(0) : 0;
 
-                        if (fieldLen != 0 && 
!BinaryUtils.isPlainArrayType(type) && BinaryUtils.isPlainType(type)) {
+                        if (fieldLen != 0 && 
!BinaryImplUtils.isPlainArrayType(type) && BinaryImplUtils.isPlainType(type)) {
                             writer.writeFieldId(fieldId);
 
                             writer.write(reader.array(), reader.position(), 
fieldLen);
@@ -322,8 +323,8 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
 
             if (reader != null) {
                 // Write raw data if any.
-                int rawOff = BinaryUtils.rawOffsetAbsolute(reader, start);
-                int footerStart = BinaryUtils.footerStartAbsolute(reader, 
start);
+                int rawOff = BinaryImplUtils.rawOffsetAbsolute(reader, start);
+                int footerStart = BinaryImplUtils.footerStartAbsolute(reader, 
start);
 
                 if (rawOff < footerStart) {
                     writer.rawWriter();
@@ -381,7 +382,7 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
         else if (newVal.getClass().isArray() && 
BinaryObject.class.isAssignableFrom(newVal.getClass().getComponentType()))
             newFldTypeId = GridBinaryMarshaller.OBJ_ARR;
 
-        else if (BinaryUtils.isBinaryEnumArray(newVal))
+        else if (BinaryImplUtils.isBinaryEnumArray(newVal))
             newFldTypeId = GridBinaryMarshaller.ENUM_ARR;
 
         else if (BinaryUtils.isBinaryArray(newVal))
@@ -432,7 +433,7 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
     private IgniteBiTuple<Integer, Integer> fieldPositionAndLength(int 
footerPos, int footerEnd, int rawPos,
         int fieldIdLen, int fieldOffsetLen) {
         // Get field offset first.
-        int fieldOffset = BinaryUtils.fieldOffsetRelative(reader, footerPos + 
fieldIdLen, fieldOffsetLen);
+        int fieldOffset = BinaryImplUtils.fieldOffsetRelative(reader, 
footerPos + fieldIdLen, fieldOffsetLen);
         int fieldPos = start + fieldOffset;
 
         // Get field length.
@@ -443,7 +444,7 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
             fieldLen = rawPos - fieldPos;
         else {
             // Field is somewhere in the middle, get difference with the next 
offset.
-            int nextFieldOffset = BinaryUtils.fieldOffsetRelative(reader,
+            int nextFieldOffset = BinaryImplUtils.fieldOffsetRelative(reader,
                 footerPos + fieldIdLen + fieldOffsetLen + fieldIdLen, 
fieldOffsetLen);
 
             fieldLen = nextFieldOffset - fieldOffset;
@@ -459,22 +460,22 @@ class BinaryObjectBuilderImpl implements 
BinaryObjectBuilderEx {
         assert reader != null;
 
         if (readCache == null) {
-            int fieldIdLen = BinaryUtils.fieldIdLength(flags);
-            int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags);
+            int fieldIdLen = BinaryImplUtils.fieldIdLength(flags);
+            int fieldOffsetLen = BinaryImplUtils.fieldOffsetLength(flags);
 
             Map<Integer, Object> readCache = new HashMap<>();
 
-            IgniteBiTuple<Integer, Integer> footer = 
BinaryUtils.footerAbsolute(reader, start);
+            IgniteBiTuple<Integer, Integer> footer = 
BinaryImplUtils.footerAbsolute(reader, start);
 
             int footerPos = footer.get1();
             int footerEnd = footer.get2();
 
-            int rawPos = BinaryUtils.rawOffsetAbsolute(reader, start);
+            int rawPos = BinaryImplUtils.rawOffsetAbsolute(reader, start);
 
             int idx = 0;
 
             while (footerPos + fieldIdLen < footerEnd) {
-                int fieldId = BinaryUtils.fieldId(reader.reader(), idx++);
+                int fieldId = BinaryImplUtils.fieldId(reader.reader(), idx++);
 
                 IgniteBiTuple<Integer, Integer> posAndLen =
                     fieldPositionAndLength(footerPos, footerEnd, rawPos, 
fieldIdLen, fieldOffsetLen);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java
index 9e9b2b6a90c..3cccbb3e72a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java
@@ -55,7 +55,6 @@ import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.lang.IgniteInClosure;
 import org.jetbrains.annotations.Nullable;
 
-import static 
org.apache.ignite.internal.binary.BinaryUtils.FLAG_COMPACT_FOOTER;
 import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_AUX;
 import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_DATA;
 import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_IDX;
@@ -421,7 +420,7 @@ public class IdleVerifyUtility {
             if (key.cacheObjectType() == TYPE_BINARY) {
                 binary++;
 
-                if (((BinaryObjectEx)key).isFlagSet(FLAG_COMPACT_FOOTER))
+                if (((BinaryObjectEx)key).isCompactFooter())
                     cf++;
                 else
                     noCf++;
diff --git 
a/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java
 
b/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java
index 543e020ccdd..965616d14db 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java
@@ -31,7 +31,7 @@ import org.apache.ignite.testframework.ListeningTestLogger;
 import org.apache.ignite.testframework.LogListener;
 import org.junit.Test;
 
-import static 
org.apache.ignite.internal.binary.BinaryUtils.FLAG_COMPACT_FOOTER;
+import static 
org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_COMPACT_FOOTER;
 
 /**
  * Tests binary configuration behavior.
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java
index bacc6fb1e34..1fafa4eaa3f 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java
@@ -503,8 +503,8 @@ public class BinarySerialiedFieldComparatorSelfTest extends 
GridCommonAbstractTe
             ? BinaryPrimitives.readShort(ptr, start + 
GridBinaryMarshaller.FLAGS_POS)
             : BinaryPrimitives.readShort(arr, start + 
GridBinaryMarshaller.FLAGS_POS);
 
-        int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : 
BinaryUtils.FIELD_ID_LEN;
-        int fieldOffLen = BinaryUtils.fieldOffsetLength(flags);
+        int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : 
BinaryImplUtils.FIELD_ID_LEN;
+        int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags);
 
         int orderBase = start + schemaOff + fieldIdLen;
         int orderMultiplier = fieldIdLen + fieldOffLen;
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java
index 150c1475bda..b3421ba9416 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java
@@ -21,7 +21,7 @@ import java.util.Objects;
 import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory;
 import org.apache.ignite.internal.util.typedef.F;
 
-import static org.apache.ignite.internal.binary.BinaryUtils.arrayEq;
+import static org.apache.ignite.testframework.GridTestUtils.arrayEq;
 
 /**
  * Compares fields in serialized form when possible.
@@ -94,12 +94,12 @@ class BinarySerializedFieldComparator {
         else {
             int pos = orderBase + order * orderMultiplier;
 
-            if (fieldOffLen == BinaryUtils.OFFSET_1) {
+            if (fieldOffLen == BinaryImplUtils.OFFSET_1) {
                 byte val = offheap() ? BinaryPrimitives.readByte(ptr, pos) : 
BinaryPrimitives.readByte(arr, pos);
 
                 curFieldPos = startOff + ((int)val & 0xFF);
             }
-            else if (fieldOffLen == BinaryUtils.OFFSET_2) {
+            else if (fieldOffLen == BinaryImplUtils.OFFSET_2) {
                 short val = offheap() ? BinaryPrimitives.readShort(ptr, pos) : 
BinaryPrimitives.readShort(arr, pos);
 
                 curFieldPos = startOff + ((int)val & 0xFFFF);
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java
index a5f2f56bae1..4bdd9989853 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java
@@ -40,7 +40,6 @@ import 
org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
 
 import static org.apache.ignite.configuration.WALMode.FSYNC;
-import static org.apache.ignite.internal.binary.BinaryUtils.arrayEq;
 import static 
org.apache.ignite.internal.processors.cache.transactions.TransactionMetricsAdapter.METRIC_SYSTEM_TIME_HISTOGRAM;
 import static 
org.apache.ignite.internal.processors.metric.GridMetricManager.HISTOGRAM_CFG_PREFIX;
 import static 
org.apache.ignite.internal.processors.metric.GridMetricManager.HITRATE_CFG_PREFIX;
@@ -50,6 +49,7 @@ import static 
org.apache.ignite.internal.processors.metric.impl.MetricUtils.cach
 import static 
org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
 import static 
org.apache.ignite.internal.processors.pool.PoolProcessor.TASK_EXEC_TIME;
 import static 
org.apache.ignite.internal.processors.pool.PoolProcessor.THREAD_POOLS;
+import static org.apache.ignite.testframework.GridTestUtils.arrayEq;
 import static 
org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause;
 import static org.apache.ignite.testframework.GridTestUtils.waitForCondition;
 import static org.junit.Assert.assertArrayEquals;
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java 
b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
index c624cc8ba22..3b428455a09 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
@@ -141,6 +141,7 @@ import org.jetbrains.annotations.Nullable;
 import static java.lang.Long.parseLong;
 import static java.util.Comparator.comparingLong;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_HOME;
+import static org.apache.ignite.internal.binary.BinaryUtils.isBinaryArray;
 import static 
org.apache.ignite.internal.pagemem.PageIdAllocator.INDEX_PARTITION;
 import static 
org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree.partitionFileName;
 import static org.apache.ignite.internal.util.lang.ClusterNodeFunc.nodeIds;
@@ -2660,4 +2661,43 @@ public final class GridTestUtils {
 
         return size[0];
     }
+
+    /**
+     * Check for arrays equality.
+     *
+     * @param a1 Value 1.
+     * @param a2 Value 2.
+     * @return {@code True} if arrays equal.
+     */
+    public static boolean arrayEq(Object a1, Object a2) {
+        if (a1 == a2)
+            return true;
+
+        if (a1 == null || a2 == null)
+            return a1 != null || a2 != null;
+
+        if (a1.getClass() != a2.getClass())
+            return false;
+
+        if (a1 instanceof byte[])
+            return Arrays.equals((byte[])a1, (byte[])a2);
+        else if (a1 instanceof boolean[])
+            return Arrays.equals((boolean[])a1, (boolean[])a2);
+        else if (a1 instanceof short[])
+            return Arrays.equals((short[])a1, (short[])a2);
+        else if (a1 instanceof char[])
+            return Arrays.equals((char[])a1, (char[])a2);
+        else if (a1 instanceof int[])
+            return Arrays.equals((int[])a1, (int[])a2);
+        else if (a1 instanceof long[])
+            return Arrays.equals((long[])a1, (long[])a2);
+        else if (a1 instanceof float[])
+            return Arrays.equals((float[])a1, (float[])a2);
+        else if (a1 instanceof double[])
+            return Arrays.equals((double[])a1, (double[])a2);
+        else if (isBinaryArray(a1))
+            return a1.equals(a2);
+
+        return Arrays.deepEquals((Object[])a1, (Object[])a2);
+    }
 }

Reply via email to