/// <summary>
        /// Helps test 2D arrays.
        /// </summary>
        /// <typeparam name="T">Type of the underlying value stored in the array.</typeparam>
        /// <param name="values">The values.</param>
        /// <param name="nullable">If set to <c>true</c> [nullable].</param>
        public static void Array2DHelper <T>(List <List <T> > values, bool nullable)
        {
            System.IO.Stream stream = new SerializedStreamBuilder()
                                      .Array <T>(values, nullable)
                                      .ToStream();

            BinaryReader reader = new BinaryReader(stream, DeserializationHelper.CannedVersion);

            string methodName = DeserializationHelper.GetReaderMethodName(typeof(T));

            MethodInfo methodInfo = GetReaderMethodInfoFromName <T>(methodName, reader);

            List <List <T> > actual = (List <List <T> >)methodInfo.Invoke(reader, new object[] { string.Empty, nullable, 2U });

            Assert.IsNotNull(actual);

            using (IEnumerator <List <T> > valuesEnumerator = values.GetEnumerator())
            {
                using (IEnumerator <List <T> > actualEnumerator = actual.GetEnumerator())
                {
                    Assert.AreEqual <int>(values.Count, actual.Count);

                    while (valuesEnumerator.MoveNext() && actualEnumerator.MoveNext())
                    {
                        TestHelper.AssertCollectionEquals <T>(valuesEnumerator.Current, actualEnumerator.Current);
                    }
                }
            }
        }
        /// <summary>
        /// Helps test empty arrays.
        /// </summary>
        /// <typeparam name="T">Type of the underlying value stored in the array.</typeparam>
        /// <param name="nullable">If set to <c>true</c> [nullable].</param>
        public static void EmptyArrayHelper <T>(bool nullable)
        {
            SerializedStreamBuilder builder = new SerializedStreamBuilder();

            if (nullable)
            {
                builder.NullableFlag(false);
            }

            System.IO.Stream stream = builder
                                      .Size(0)
                                      .ToStream();

            BinaryReader reader = new BinaryReader(stream, DeserializationHelper.CannedVersion);

            for (uint rank = 1; rank <= 4; rank++)
            {
                string methodName = DeserializationHelper.GetReaderMethodName(typeof(T));

                MethodInfo methodInfo = GetReaderMethodInfoFromName <T>(methodName, reader);

                ICollection obj = (ICollection)methodInfo.Invoke(reader, new object[] { string.Empty, nullable, rank });
                Assert.AreEqual <int>(obj.Count, 0);

                stream.Seek(0L, System.IO.SeekOrigin.Begin);
            }
        }
        /// <summary>
        /// Helps test 1D arrays.
        /// </summary>
        /// <typeparam name="T">Type of the underlying value stored in the array.</typeparam>
        /// <param name="values">The values.</param>
        /// <param name="nullable">If set to <c>true</c> [nullable].</param>
        public static void Array1DHelper <T>(List <T> values, bool nullable)
        {
            System.IO.Stream stream = new SerializedStreamBuilder()
                                      .Array <T>(values, nullable)
                                      .ToStream();

            BinaryReader reader = new BinaryReader(stream, DeserializationHelper.CannedVersion);

            string methodName = DeserializationHelper.GetReaderMethodName(typeof(T));

            MethodInfo methodInfo = GetReaderMethodInfoFromName <T>(methodName, reader);

            List <T> actual = (List <T>)methodInfo.Invoke(reader, new object[] { string.Empty, nullable, 1U });

            if (values != null)
            {
                Assert.IsNotNull(actual);
            }
            else
            {
                Assert.IsNull(actual);
            }

            TestHelper.AssertCollectionEquals <T>(values, actual);
        }