且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

最简单的TCP网络封包解包(补充)-序列化

更新时间:2022-08-22 11:55:59

将数据能够在TCP中进行传输的两种方法
1.直接拷贝struct就可以了;
2.序列化。

拷贝Struct存在的问题
1.不能应付可变长类型的数据,比如STL中的那些容器,他们的长度都是不确定的。当然,STL的容器归根到底就是一个class
2.内存对齐的问题,Windows默认的对齐是4字节,如果不去刻意关闭掉对齐的话,那么可能会多出不少没必要的字节数,有时候,这个损耗是客观的。但是如果关闭了,内存拷贝又会慢一些,内存IO相对于网络IO来说,速度是快的,略微的增加内存IO的压力来调优网络IO是可行的。

序列化是怎么序列化的?
其实很简单,就是按位拷贝。在这里,我们使用一个uint8类型的变长数组作为一个容器。假设我们这里有一个uint16类型的数据,那么我们就把它拷贝进去uint8的数组里面,那么它就占了两个元素,如果是uint32,则这个数据占了4个元素位。它的原理是非常的简单的。至于具体请参考下面代码里面的ByteBuffer::append()方法。而那些class神马的,只要我们序列化的顺序和反序列化的顺序是配对的,我们就可以按照这个顺序进行序列化和反序列化了。这个在BytBuffer里面已经默认支持了常用的几个STL容器(vector,list等)。

类型定义
最简单的TCP网络封包解包(补充)-序列化#if defined(_MSC_VER)
最简单的TCP网络封包解包(补充)-序列化    //
最简单的TCP网络封包解包(补充)-序列化    
// Windows/Visual C++
最简单的TCP网络封包解包(补充)-序列化    
//
最简单的TCP网络封包解包(补充)-序列化
    typedef signed __int8            int8;
最简单的TCP网络封包解包(补充)-序列化    typedef unsigned __int8            uint8;
最简单的TCP网络封包解包(补充)-序列化    typedef signed __int16            int16;
最简单的TCP网络封包解包(补充)-序列化    typedef unsigned __int16        uint16;
最简单的TCP网络封包解包(补充)-序列化    typedef signed __int32            int32;
最简单的TCP网络封包解包(补充)-序列化    typedef unsigned __int32        uint32;
最简单的TCP网络封包解包(补充)-序列化    typedef signed __int64            int64;
最简单的TCP网络封包解包(补充)-序列化    typedef unsigned __int64        uint64;
最简单的TCP网络封包解包(补充)-序列化#endif
有的类型的长度会因硬件或者操作系统而异,如果直接使用c++关键字中的类型定义可能会出现问题。因此,需要自己定义以上这样的类型。利用宏去适配各个操作系统或者硬件平台。

ByteBuffer的代码
最简单的TCP网络封包解包(补充)-序列化//////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化
/// 字节流缓冲类,可以进行序列化和解序列化操作,并且可以缓冲字节流数据。
最简单的TCP网络封包解包(补充)-序列化
//////////////////////////////////////////////////////////////////////////

最简单的TCP网络封包解包(补充)-序列化class ByteBuffer
最简单的TCP网络封包解包(补充)-序列化{
最简单的TCP网络封包解包(补充)-序列化public:
最简单的TCP网络封包解包(补充)-序列化    const static size_t DEFAULT_SIZE = 0x1000;
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer()
最简单的TCP网络封包解包(补充)-序列化        : mReadPos(0)
最简单的TCP网络封包解包(补充)-序列化        , mWritePos(0)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        mStorage.reserve(DEFAULT_SIZE);
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer(size_t res)
最简单的TCP网络封包解包(补充)-序列化        : mReadPos(0)
最简单的TCP网络封包解包(补充)-序列化        , mWritePos(0)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        mStorage.reserve(res);
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer(const ByteBuffer &buf) 
最简单的TCP网络封包解包(补充)-序列化        : mReadPos(buf.mReadPos)
最简单的TCP网络封包解包(补充)-序列化        , mWritePos(buf.mWritePos)
最简单的TCP网络封包解包(补充)-序列化        , mStorage(buf.mStorage)
最简单的TCP网络封包解包(补充)-序列化    {}
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    //////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化public:
最简单的TCP网络封包解包(补充)-序列化    void clear()
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        mStorage.clear();
最简单的TCP网络封包解包(补充)-序列化        mReadPos = mWritePos = 0;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    template <typename T>
最简单的TCP网络封包解包(补充)-序列化        void append(T value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append((uint8*)&value, sizeof(value));
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    template <typename T>
最简单的TCP网络封包解包(补充)-序列化        void put(size_t pos, T value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        put(pos, (uint8*)&value, sizeof(value));
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    //////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化public:
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(bool value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<char>((char)value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(uint8 value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<uint8>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(uint16 value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<uint16>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(uint32 value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<uint32>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(uint64 value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<uint64>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(int8 value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<int8>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(int16 value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<int16>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(int32 value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<int32>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(int64 value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<int64>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(float value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<float>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(double value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<double>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(time_t value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append<time_t>(value);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(const std::string& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append((uint8 const *)value.c_str(), value.length());
最简单的TCP网络封包解包(补充)-序列化        append((uint8)0);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator<<(const char* str)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append( (uint8 const *)str, str ? strlen(str) : 0);
最简单的TCP网络封包解包(补充)-序列化        append((uint8)0);
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    //////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化public:
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(bool& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<char>() > 0 ? true : false;
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(uint8& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<uint8>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(uint16& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<uint16>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(uint32& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<uint32>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(uint64& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<uint64>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(int8& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<int8>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(int16& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<int16>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(int32& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<int32>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(int64& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<int64>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(float &value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<float>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(double &value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<double>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(time_t& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value = read<time_t>();
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(std::string& value)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        value.clear();
最简单的TCP网络封包解包(补充)-序列化        while (rpos() < size())
最简单的TCP网络封包解包(补充)-序列化        {
最简单的TCP网络封包解包(补充)-序列化            char c = read<char>();
最简单的TCP网络封包解包(补充)-序列化            if (c == 0)
最简单的TCP网络封包解包(补充)-序列化            {
最简单的TCP网络封包解包(补充)-序列化                break;
最简单的TCP网络封包解包(补充)-序列化            }

最简单的TCP网络封包解包(补充)-序列化            value += c;
最简单的TCP网络封包解包(补充)-序列化        }

最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    ByteBuffer& operator>>(char value[])
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        std::string strValue;
最简单的TCP网络封包解包(补充)-序列化        strValue.clear();
最简单的TCP网络封包解包(补充)-序列化        while (rpos() < size())
最简单的TCP网络封包解包(补充)-序列化        {
最简单的TCP网络封包解包(补充)-序列化            char c = read<char>();
最简单的TCP网络封包解包(补充)-序列化            if (c == 0)
最简单的TCP网络封包解包(补充)-序列化            {
最简单的TCP网络封包解包(补充)-序列化                break;
最简单的TCP网络封包解包(补充)-序列化            }

最简单的TCP网络封包解包(补充)-序列化            strValue += c;
最简单的TCP网络封包解包(补充)-序列化        }

最简单的TCP网络封包解包(补充)-序列化        strncpy(value, strValue.c_str(), strValue.size());
最简单的TCP网络封包解包(补充)-序列化        return *this;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    //////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化public:
最简单的TCP网络封包解包(补充)-序列化    uint8 operator[](size_t pos)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        return read<uint8>(pos);
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    size_t rpos() const
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        return mReadPos;
最简单的TCP网络封包解包(补充)-序列化    }
;
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    size_t rpos(size_t rpos_)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        mReadPos = rpos_;
最简单的TCP网络封包解包(补充)-序列化        return mReadPos;
最简单的TCP网络封包解包(补充)-序列化    }
;
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    size_t wpos() const
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        return mWritePos;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    size_t wpos(size_t wpos_)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        mWritePos = wpos_;
最简单的TCP网络封包解包(补充)-序列化        return mWritePos;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    template <typename T> T read()
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        T r = read<T>(mReadPos);
最简单的TCP网络封包解包(补充)-序列化        mReadPos += sizeof(T);
最简单的TCP网络封包解包(补充)-序列化        return r;
最简单的TCP网络封包解包(补充)-序列化    }
;
最简单的TCP网络封包解包(补充)-序列化    template <typename T> T read(size_t pos) const
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        assert(pos + sizeof(T) <= size() || PrintPosError(false,pos,sizeof(T)));
最简单的TCP网络封包解包(补充)-序列化        return *((T const*)&mStorage[pos]);
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    void read(uint8 *dest, size_t len)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        assert(mReadPos  + len  <= size() || PrintPosError(false, mReadPos,len));
最简单的TCP网络封包解包(补充)-序列化        memcpy(dest, &mStorage[mReadPos], len);
最简单的TCP网络封包解包(补充)-序列化        mReadPos += len;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    const uint8* contents() const return &mStorage[mReadPos]; }
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    size_t size() const return mStorage.size(); }
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    bool empty() const return mStorage.empty(); }
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    void resize(size_t _NewSize)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        mStorage.resize(_NewSize);
最简单的TCP网络封包解包(补充)-序列化        mReadPos = 0;
最简单的TCP网络封包解包(补充)-序列化        mWritePos = size();
最简单的TCP网络封包解包(补充)-序列化    }
;
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    void reserve(size_t _Size)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        if (_Size > size()) mStorage.reserve(_Size);
最简单的TCP网络封包解包(补充)-序列化    }
;
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    void append(const std::string& str)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        append((uint8 const*)str.c_str(), str.size() + 1);
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    void append(const char *src, size_t cnt)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        return append((const uint8 *)src, cnt);
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    void append(const uint8 *src, size_t cnt)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        if (!cnt) return;
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化        assert(size() < 10000000);
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化        if (mStorage.size() < mWritePos + cnt)
最简单的TCP网络封包解包(补充)-序列化        {
最简单的TCP网络封包解包(补充)-序列化            mStorage.resize(mWritePos + cnt);
最简单的TCP网络封包解包(补充)-序列化        }

最简单的TCP网络封包解包(补充)-序列化        memcpy(&mStorage[mWritePos], src, cnt);
最简单的TCP网络封包解包(补充)-序列化        mWritePos += cnt;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    void append(const ByteBuffer& buffer)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        if (buffer.size()) append(buffer.contents(),buffer.size());
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    void put(size_t pos, const uint8 *src, size_t cnt)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        assert(pos + cnt <= size() || PrintPosError(true,pos,cnt));
最简单的TCP网络封包解包(补充)-序列化        memcpy(&mStorage[pos], src, cnt);
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    //////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化public:
最简单的TCP网络封包解包(补充)-序列化    void print_storage()
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    void textlike()
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    void hexlike()
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    bool PrintPosError(bool add, size_t pos, size_t esize) const
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        printf("ERROR: Attempt %s in ByteBuffer (pos: %u size: %u) value with size: %u",(add ? "put" : "get"), pos, size(), esize);
最简单的TCP网络封包解包(补充)-序列化        return false;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化protected:
最简单的TCP网络封包解包(补充)-序列化    size_t                mReadPos;
最简单的TCP网络封包解包(补充)-序列化    size_t                mWritePos;
最简单的TCP网络封包解包(补充)-序列化    std::vector<uint8>    mStorage;
最简单的TCP网络封包解包(补充)-序列化}
;
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化//////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化// std::vector
最简单的TCP网络封包解包(补充)-序列化
//////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化#ifdef _VECTOR_
最简单的TCP网络封包解包(补充)-序列化template <typename T>
最简单的TCP网络封包解包(补充)-序列化ByteBuffer& operator<<(ByteBuffer& b, const std::vector<T>& v)
最简单的TCP网络封包解包(补充)-序列化{
最简单的TCP网络封包解包(补充)-序列化    b << (uint32)v.size();
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    typename std::vector<T>::const_iterator iter    = v.begin();
最简单的TCP网络封包解包(补充)-序列化    typename std::vector<T>::const_iterator& iEnd    = v.end();
最简单的TCP网络封包解包(补充)-序列化    for (; iter != iEnd; ++iter)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        b << *iter;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    return b;
最简单的TCP网络封包解包(补充)-序列化}

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化template <typename T>
最简单的TCP网络封包解包(补充)-序列化ByteBuffer& operator>>(ByteBuffer& b, std::vector<T>& v)
最简单的TCP网络封包解包(补充)-序列化{
最简单的TCP网络封包解包(补充)-序列化    uint32 vsize;
最简单的TCP网络封包解包(补充)-序列化    b >> vsize;
最简单的TCP网络封包解包(补充)-序列化    v.clear();
最简单的TCP网络封包解包(补充)-序列化    while (vsize--)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        T t;
最简单的TCP网络封包解包(补充)-序列化        b >> t;
最简单的TCP网络封包解包(补充)-序列化        v.push_back(t);
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    return b;
最简单的TCP网络封包解包(补充)-序列化}

最简单的TCP网络封包解包(补充)-序列化#endif
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化//////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化// std::list
最简单的TCP网络封包解包(补充)-序列化
//////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化#ifdef _LIST_
最简单的TCP网络封包解包(补充)-序列化template <typename T>
最简单的TCP网络封包解包(补充)-序列化ByteBuffer& operator<<(ByteBuffer& b, const std::list<T>& v)
最简单的TCP网络封包解包(补充)-序列化{
最简单的TCP网络封包解包(补充)-序列化    b << (uint32)v.size();
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    typename std::list<T>::const_iterator iter    = v.begin();
最简单的TCP网络封包解包(补充)-序列化    typename std::list<T>::const_iterator& iEnd    = v.end();
最简单的TCP网络封包解包(补充)-序列化    for (; iter != iEnd; ++iter)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        b << *iter;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    return b;
最简单的TCP网络封包解包(补充)-序列化}

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化template <typename T>
最简单的TCP网络封包解包(补充)-序列化ByteBuffer& operator>>(ByteBuffer& b, std::list<T>& v)
最简单的TCP网络封包解包(补充)-序列化{
最简单的TCP网络封包解包(补充)-序列化    uint32 vsize;
最简单的TCP网络封包解包(补充)-序列化    b >> vsize;
最简单的TCP网络封包解包(补充)-序列化    v.clear();
最简单的TCP网络封包解包(补充)-序列化    while (vsize--)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        T t;
最简单的TCP网络封包解包(补充)-序列化        b >> t;
最简单的TCP网络封包解包(补充)-序列化        v.push_back(t);
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    return b;
最简单的TCP网络封包解包(补充)-序列化}

最简单的TCP网络封包解包(补充)-序列化#endif
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化//////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化// std::map
最简单的TCP网络封包解包(补充)-序列化
//////////////////////////////////////////////////////////////////////////
最简单的TCP网络封包解包(补充)-序列化#ifdef _MAP_
最简单的TCP网络封包解包(补充)-序列化template <typename K, typename V>
最简单的TCP网络封包解包(补充)-序列化ByteBuffer& operator<<(ByteBuffer& b, const std::map<K, V>& m)
最简单的TCP网络封包解包(补充)-序列化{
最简单的TCP网络封包解包(补充)-序列化    b << (uint32)m.size();
最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化    typename std::map<K, V>::const_iterator iter = m.begin();
最简单的TCP网络封包解包(补充)-序列化    typename std::map<K, V>::const_iterator iEnd = m.end();
最简单的TCP网络封包解包(补充)-序列化    for (; iter != iEnd; ++iter)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        b << iter->first << iter->second;
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    return b;
最简单的TCP网络封包解包(补充)-序列化}

最简单的TCP网络封包解包(补充)-序列化
最简单的TCP网络封包解包(补充)-序列化template <typename K, typename V>
最简单的TCP网络封包解包(补充)-序列化ByteBuffer &operator>>(ByteBuffer& b, std::map<K, V>& m)
最简单的TCP网络封包解包(补充)-序列化{
最简单的TCP网络封包解包(补充)-序列化    uint32 msize;
最简单的TCP网络封包解包(补充)-序列化    b >> msize;
最简单的TCP网络封包解包(补充)-序列化    m.clear();
最简单的TCP网络封包解包(补充)-序列化    while (msize--)
最简单的TCP网络封包解包(补充)-序列化    {
最简单的TCP网络封包解包(补充)-序列化        K k;
最简单的TCP网络封包解包(补充)-序列化        V v;
最简单的TCP网络封包解包(补充)-序列化        b >> k >> v;
最简单的TCP网络封包解包(补充)-序列化        m.insert(std::make_pair(k, v));
最简单的TCP网络封包解包(补充)-序列化    }

最简单的TCP网络封包解包(补充)-序列化    return b;
最简单的TCP网络封包解包(补充)-序列化}

最简单的TCP网络封包解包(补充)-序列化#endif


如何利用ByteBuffer序列化和反序列化
假设我们要序列化std::string的数据,那么我们这样做:
最简单的TCP网络封包解包(补充)-序列化std::string str;
最简单的TCP网络封包解包(补充)-序列化ByteBuffer buf;
最简单的TCP网络封包解包(补充)-序列化buf << str;
那么,如何将这个str反序列化出来呢?这样做:
最简单的TCP网络封包解包(补充)-序列化std::string str;
最简单的TCP网络封包解包(补充)-序列化ByteBuffer buf;
最简单的TCP网络封包解包(补充)-序列化buf >> str;
So Easy!是吧。具体在TCP收发包的实际场景中怎样做,我也不多废话,请看下面下载提供的代码便是了。


在实用下细节上的一些区别
通常情况下,一个协议的数据集会定义为一个struct,然后重载其<<和>>算符用于序列化和反序列化。这个如果仅仅是在C++下倒还好,但如若放置在混合语言编程的情况下,这可能就不行了,很多语言是不支持算符重载的。如若纯逻辑都在lua或者python神马里面做,我们只能为每个基本类型写一个read和write的方法:readInt8,readInt16,,readString,writeInt8,writeInt16,writeString等等。然后在每个协议处理方法里面按照顺序逐个的处理协议数据集的数据,这样是很容易出问题的,却也是没有办法的办法了。

Google Protocol Buffer(ProtoBuf)
在开源工具里面,不得不提到的就是它了,它很适合于混合语言的情况下使用。它自己有一套自己的数据描述语言,数据序列化的描述都写在.proto。只需要写一次.proto文件,便可以在多语言里面使用了该协议了。比如,我曾经做过一个VC+Flash AS3的项目,就是用的它。如果没有它,网络协议我必须在c++里面定义一次,flash里面再定义一次,那可真真是麻烦死了,麻烦倒还是小事情,如果两边的定义不同步的话,序列化或者反序列化就会发生错误,那可就糟糕了。
如果有多语言的需求,***就是使用像ProtoBuf这样的解决方案。当然,如果没有跨语言的需求,还是尽量简单为好,比如上面的ByteBuffer,毕竟简单的东西自己可以比较轻松的掌控。
主页地址:http://code.google.com/p/protobuf/


代码下载testByteBuffer.rar
 


EDIT:
time_t解序列化写错了,参数应该是一个传出值,为一个引用,但是我把引用符给忘记了。特此订正!
最简单的TCP网络封包解包(补充)-序列化 ByteBuffer& operator>>(time_t& value)
最简单的TCP网络封包解包(补充)-序列化 {
最简单的TCP网络封包解包(补充)-序列化 value = read<time_t>();
最简单的TCP网络封包解包(补充)-序列化 return *this;
最简单的TCP网络封包解包(补充)-序列化 }