public object Decode(NetWork.ByteBuffer buffer)
        {
            CharacterDataSnapshot data = new CharacterDataSnapshot();

            byte flag = FLAG_END;

            do
            {
                flag = buffer.ReadByte();

                switch (flag)
                {
                case FLAG_VERSION:
                    data.Version = buffer.ReadLong();
                    break;

                case FLAG_DATA_LIST:
                {
                    int size = buffer.ReadShort();
                    if (size == 0)
                    {
                        continue;
                    }
                    List <TBase> list = new List <TBase>(size);
                    data.DataList = list;
                    for (int i = 0; i < size; i++)
                    {
                        string className  = buffer.ReadString();
                        byte[] tbaseBytes = new byte[buffer.ReadInt()];
                        buffer.ReadBytes(tbaseBytes, 0, tbaseBytes.Length);
                        TBase tbase = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(className, false) as TBase;
                        ThriftSerialize.DeSerialize(tbase, tbaseBytes);
                        list.Add(tbase);
                    }
                    break;
                }
                }
            }while(flag != FLAG_END);

            return(data);
        }
        public void Encode(NetWork.ByteBuffer buffer, object value)
        {
            CharacterDataSnapshot data = value as CharacterDataSnapshot;

            buffer.WriteByte(FLAG_VERSION);
            buffer.WriteLong(data.Version);
            buffer.WriteByte(FLAG_DATA_LIST);

            int size = data.DataList != null ? data.DataList.Count : 0;

            buffer.WriteShort((short)size);
            if (size > 0)
            {
                foreach (TBase tbase in data.DataList)
                {
                    buffer.WriteString(tbase.GetType().FullName);
                    byte[] tbaseBytes = ThriftSerialize.Serialize(tbase);
                    buffer.WriteInt(tbaseBytes.Length);
                    buffer.WriteBytes(tbaseBytes);
                }
            }

            buffer.WriteByte(FLAG_END);
        }