/// <summary>Serializes the specified table.</summary>
        /// <param name="writer">The writer.</param>
        /// <param name="flags">The flags.</param>
        /// <param name="layout">The layout.</param>
        /// <param name="rows">The rows.</param>
        /// <exception cref="ArgumentNullException">Rows or Layout or Writer.</exception>
        public static void Serialize(this DataWriter writer, Flags flags, RowLayout layout, params Row[] rows)
        {
            if (rows == null)
            {
                throw new ArgumentNullException(nameof(rows));
            }

            if (layout == null)
            {
                throw new ArgumentNullException(nameof(layout));
            }

            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }

            writer.Write7BitEncoded32((int)flags);
            if ((flags & Flags.WithLayout) != 0)
            {
                layout.Save(writer);
            }

            writer.Write7BitEncoded64(rows.Length);
            foreach (var row in rows)
            {
                SerializeData(writer, layout, row);
            }
        }