private void SerializeStackItem(StackItemBase item, BinaryWriter writer)
        {
            switch (item)
            {
            case ByteArrayStackItem _:
            {
                writer.Write((byte)EStackItemType.ByteArray);
                writer.WriteVarBytes(item.ToByteArray());
                break;
            }

            case BooleanStackItem bl:
            {
                writer.Write((byte)EStackItemType.Bool);
                writer.Write(bl.Value);
                break;
            }

            case IntegerStackItem _:
            {
                writer.Write((byte)EStackItemType.Integer);
                writer.WriteVarBytes(item.ToByteArray());
                break;
            }

            case ArrayStackItem array:
            {
                if (array.IsStruct)
                {
                    writer.Write((byte)EStackItemType.Struct);
                }
                else
                {
                    writer.Write((byte)EStackItemType.Array);
                }

                writer.WriteVarInt(array.Count);

                foreach (StackItemBase subitem in array)
                {
                    SerializeStackItem(subitem, writer);
                }

                break;
            }

            case MapStackItem map:
            {
                writer.Write((byte)EStackItemType.Map);
                writer.WriteVarInt(map.Count);

                foreach (var pair in map)
                {
                    SerializeStackItem(pair.Key, writer);
                    SerializeStackItem(pair.Value, writer);
                }

                break;
            }

            default: throw new NotSupportedException();
            }
        }