private void checkSerializeCollection <T, CollectionType>(CollectionType value) where CollectionType : ICollection <T>
        {
            var writer = new ByteBufferWriter(BufferSerializer.Capacity(value));

            value.BufferWrite(writer);
            CollectionType valueSerialized = BufferSerializer.Read <CollectionType>(writer.GetBufferReader());

            foreach (var i in value)
            {
                Assert.IsTrue(valueSerialized.Contains(i), $"check serialize read failed, value: {i}");
            }

            valueSerialized = BufferSerializer.Merge(writer.GetBufferReader(), default(CollectionType));
            foreach (var i in value)
            {
                Assert.IsTrue(valueSerialized.Contains(i), $"check serialize merge failed, value: {i}");
            }

            writer = new ByteBufferWriter(BufferSerializer.Capacity <object>(value));
            BufferSerializer.Write <object>(writer, value);
            valueSerialized = (CollectionType)BufferSerializer.Read <object>(writer.GetBufferReader());
            foreach (var i in value)
            {
                Assert.IsTrue(valueSerialized.Contains(i), $"check serialize object read failed, value: {i}");
            }

            writer = new ByteBufferWriter(BufferSerializer.Capacity <object>(value));
            BufferSerializer.Write <object>(writer, value);
            valueSerialized = (CollectionType)BufferSerializer.Merge <object>(writer.GetBufferReader(), default(CollectionType));
            foreach (var i in value)
            {
                Assert.IsTrue(valueSerialized.Contains(i), $"check serialize object merge failed, value: {i}");
            }
        }
        private void checkSerializeArray <T>(T[] value)
        {
            var writer = new ByteBufferWriter(BufferSerializer.Capacity(value));

            value.BufferWrite(writer);
            var valueSerialized = BufferSerializer.Read <T[]>(writer.GetBufferReader());

            for (int i = 0; i < value.Length; i++)
            {
                Assert.AreEqual(value[i], valueSerialized[i], $"check serialize read failed, value: {value[i]}, serialized value: {valueSerialized[i]}");
            }

            valueSerialized = BufferSerializer.Merge(writer.GetBufferReader(), default(T[]));
            for (int i = 0; i < value.Length; i++)
            {
                Assert.AreEqual(value[i], valueSerialized[i], $"check serialize merge failed, value: {value[i]}, serialized value: {valueSerialized[i]}");
            }

            writer = new ByteBufferWriter(BufferSerializer.Capacity <object>(value));
            BufferSerializer.Write <object>(writer, value);
            valueSerialized = (T[])BufferSerializer.Read <object>(writer.GetBufferReader());
            for (int i = 0; i < value.Length; i++)
            {
                Assert.AreEqual(value[i], valueSerialized[i], $"check serialize object read failed, value: {value[i]}, serialized value: {valueSerialized[i]}");
            }

            writer = new ByteBufferWriter(BufferSerializer.Capacity <object>(value));
            BufferSerializer.Write <object>(writer, value);
            valueSerialized = (T[])BufferSerializer.Merge <object>(writer.GetBufferReader(), default(T[]));
            for (int i = 0; i < value.Length; i++)
            {
                Assert.AreEqual(value[i], valueSerialized[i], $"check serialize object merge failed, value: {value[i]}, serialized value: {valueSerialized[i]}");
            }
        }
        private void checkSerializeGenericMul <T>(dynamic value)
        {
            var writer = new ByteBufferWriter(BufferSerializer.Capacity <T>(value));

            BufferSerializer.Write <T>(writer, value);
            dynamic valueSerialized = BufferSerializer.Read <T>(writer.GetBufferReader());

            checkClassValue(value.ClassGeneric, valueSerialized.ClassGeneric);

            valueSerialized = BufferSerializer.Merge <T>(writer.GetBufferReader(), default(T));
            checkClassValue(value.ClassGeneric, valueSerialized.ClassGeneric);
        }
        private void checkSerializeInterface <T>(dynamic value)
        {
            var writer = new ByteBufferWriter(BufferSerializer.Capacity <T>(value));

            BufferSerializer.Write <T>(writer, value);
            dynamic valueSerialized = BufferSerializer.Read <T>(writer.GetBufferReader());

            checkInterfaceValue(value, valueSerialized);

            valueSerialized = BufferSerializer.Merge <T>(writer.GetBufferReader(), default(T));
            checkInterfaceValue(value, valueSerialized);
        }
        private void checkSerializeValue <T>(T value)
        {
            var writer = new ByteBufferWriter(BufferSerializer.Capacity(value));

            value.BufferWrite(writer);
            T valueSerialized = BufferSerializer.Read <T>(writer.GetBufferReader());

            Assert.AreEqual(value, valueSerialized, $"check serialize read failed, value: {value}, serialized value: {valueSerialized}");

            valueSerialized = BufferSerializer.Merge <T>(writer.GetBufferReader(), default(T));
            Assert.AreEqual(value, valueSerialized, $"check serialize merge failed, value: {value}, serialized value: {valueSerialized}");

            writer = new ByteBufferWriter(BufferSerializer.Capacity <object>(value));
            BufferSerializer.Write <object>(writer, value);
            valueSerialized = (T)BufferSerializer.Read <object>(writer.GetBufferReader());
            Assert.AreEqual(value, valueSerialized, $"check serialize object read failed, value: {value}, serialized value: {valueSerialized}");

            writer = new ByteBufferWriter(BufferSerializer.Capacity <object>(value));
            BufferSerializer.Write <object>(writer, value);
            valueSerialized = (T)BufferSerializer.Merge <object>(writer.GetBufferReader(), default(T));
            Assert.AreEqual(value, valueSerialized, $"check serialize object merge failed, value: {value}, serialized value: {valueSerialized}");
        }
        private void checkSerializeDictionary <Key, Value, DictionaryType>(DictionaryType value) where DictionaryType : IDictionary <Key, Value>
        {
            var writer = new ByteBufferWriter(BufferSerializer.Capacity(value));

            value.BufferWrite(writer);
            DictionaryType valueSerialized = BufferSerializer.Read <DictionaryType>(writer.GetBufferReader());

            foreach (var i in value)
            {
                Assert.IsTrue(valueSerialized.ContainsKey(i.Key), $"check serialize read failed, key: {i.Key}");
                Assert.AreEqual(value[i.Key], valueSerialized[i.Key], $"check serialize read failed, value: {value[i.Key]}, serialized value: {valueSerialized[i.Key]}");
            }

            valueSerialized = BufferSerializer.Merge(writer.GetBufferReader(), default(DictionaryType));
            foreach (var i in value)
            {
                Assert.IsTrue(valueSerialized.ContainsKey(i.Key), $"check serialize merge failed, key: {i.Key}");
                Assert.AreEqual(value[i.Key], valueSerialized[i.Key], $"check serialize merge failed, value: {value[i.Key]}, serialized value: {valueSerialized[i.Key]}");
            }

            writer = new ByteBufferWriter(BufferSerializer.Capacity <object>(value));
            BufferSerializer.Write <object>(writer, value);
            valueSerialized = (DictionaryType)BufferSerializer.Read <object>(writer.GetBufferReader());
            foreach (var i in value)
            {
                Assert.IsTrue(valueSerialized.ContainsKey(i.Key), $"check serialize object read failed, key: {i.Key}");
                Assert.AreEqual(value[i.Key], valueSerialized[i.Key], $"check serialize object read failed, value: {value[i.Key]}, serialized value: {valueSerialized[i.Key]}");
            }

            BufferSerializer.Write <object>(writer, value);
            valueSerialized = (DictionaryType)BufferSerializer.Merge <object>(writer.GetBufferReader(), default(DictionaryType));
            foreach (var i in value)
            {
                Assert.IsTrue(valueSerialized.ContainsKey(i.Key), $"check serialize object merge failed, key: {i.Key}");
                Assert.AreEqual(value[i.Key], valueSerialized[i.Key], $"check serialize object merge failed, value: {value[i.Key]}, serialized value: {valueSerialized[i.Key]}");
            }
        }