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}");
            }
        }
        public void TestSerializeAttribute()
        {
            var value = new CheckAttribute();

            value.A = Rand.Default.RandInt();
            value.a = Rand.Default.RandInt();
            value.Setb(Rand.Default.RandInt());
            value.C = Rand.Default.RandInt();
            value.c = Rand.Default.RandInt();

            var writer = new ByteBufferWriter(BufferSerializer.Capacity(value));

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

            Assert.AreNotEqual(value.A, valueSerialized.A, $"check serialize skip failed, value A: {value.A}, serialized value A: {valueSerialized.A}");
            Assert.AreNotEqual(value.a, valueSerialized.a, $"check serialize skip failed, value a: {value.a}, serialized value a: {valueSerialized.a}");
            Assert.AreEqual(value.Getb(), valueSerialized.Getb(), $"check serialize failed, value b: {value.Getb()}, serialized value b: {valueSerialized.Getb()}");
            Assert.AreEqual(value.C, valueSerialized.C, $"check serialize read failed, value C: {value.C}, serialized value C: {valueSerialized.C}");
            Assert.AreEqual(value.c, valueSerialized.c, $"check serialize read failed, value c: {value.c}, serialized value c: {valueSerialized.c}");

            valueSerialized = BufferSerializer.Merge <CheckAttribute>(writer.GetBufferReader(), default(CheckAttribute));
            Assert.AreNotEqual(value.A, valueSerialized.A, $"check serialize skip failed, value A: {value.A}, serialized value A: {valueSerialized.A}");
            Assert.AreNotEqual(value.a, valueSerialized.a, $"check serialize skip failed, value a: {value.a}, serialized value a: {valueSerialized.a}");
            Assert.AreEqual(value.Getb(), valueSerialized.Getb(), $"check serialize failed, value b: {value.Getb()}, serialized value b: {valueSerialized.Getb()}");
            Assert.AreEqual(value.C, valueSerialized.C, $"check serialize read failed, value C: {value.C}, serialized value C: {valueSerialized.C}");
            Assert.AreEqual(value.c, valueSerialized.c, $"check serialize read failed, value c: {value.c}, serialized value c: {valueSerialized.c}");

            var valueAs = BufferSerializer.Read <CheckAttributeAs>(writer.GetBufferReader());

            Assert.AreEqual(value.C, valueAs.A, $"check serialize As failed, value A: {value.C}, serialized value A: {valueAs.A}");
            Assert.AreEqual(value.c, valueAs.a, $"check serialize As failed, value a: {value.c}, serialized value a: {valueAs.a}");
            Assert.AreEqual(value.Getb(), valueAs.b, $"check serialize failed, value b: {value.Getb()}, serialized value b: {valueAs.b}");
        }
        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]}");
            }
        }