• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            3d Game Walkman

            3d圖形渲染,網(wǎng)絡(luò)引擎 — tonykee's Blog
            隨筆 - 45, 文章 - 0, 評(píng)論 - 309, 引用 - 0
            數(shù)據(jù)加載中……

            這段時(shí)間加入了網(wǎng)絡(luò)序列化的功能

            前面的文章也提到了,看了一些服務(wù)器的大師級(jí)的代碼,SmartStruct和自定義序列化的方式都有,如果單單只用C結(jié)構(gòu)體作為語(yǔ)意數(shù)據(jù)載體固然可以,但很多網(wǎng)友也提出了很多質(zhì)疑,最大的缺陷就是靈活性欠佳,誠(chéng)然如此。

            這段時(shí)間沉下了心,好好寫(xiě)了一些類(lèi)主要有:

            ObjectStream
            StreamBuffer
            SerializeMap
            PacketStruct
            ...

            等等,有了前人的經(jīng)驗(yàn),似乎也算比較順利,一個(gè)個(gè)從基本的數(shù)字,
            到數(shù)組,到char[] (很多資料也稱(chēng)之為:raw 二進(jìn)制序列)
            再到STL 的一系列容器的序列化工作都實(shí)現(xiàn)了

            其中大量使用了模版類(lèi)的泛型設(shè)計(jì),不必要求一個(gè)可序列化的類(lèi)必須繼承某某基類(lèi),只需要具備以下:

             SerializeTag ComputeTag();
             bool Read(ObjectStream& stream);
             bool Write(ObjectStream& stream);
             DWORD GetLength(ObjectStream& stream);
             bool operator==(const PacketHeader &other) const;

            五個(gè)方法就可以了,如果隨意給你一個(gè)事先定義好的類(lèi),可以實(shí)現(xiàn)序列化嗎?當(dāng)然可以,只需要寫(xiě)出該類(lèi)的
            Wrapped Proxy,再添加這5個(gè)方法,就能通過(guò) ObjectStream 和 StreamBuffer 實(shí)現(xiàn)該類(lèi)的序列化了

            這些是寫(xiě)完成了,回頭看看自己已經(jīng)寫(xiě)好的網(wǎng)絡(luò)邏輯模塊,犯愁了。
            唉……,加入序列化,相當(dāng)于高層次的通訊協(xié)議全都變了,包結(jié)構(gòu)要改,所有的業(yè)務(wù)邏輯通訊代碼隨之要改。

            之前的工作…… 又要寫(xiě)大量的重構(gòu)代碼了。

            重構(gòu)真是件痛苦的事情。
            最壞的打算把之前的一些邏輯東西按現(xiàn)有思路重寫(xiě)一遍嘛,二次加工也許能應(yīng)禍得福,把破舊看不過(guò)眼的地方重整理的更漂亮,好比重新裝修升級(jí)一樣

            現(xiàn)在,只能告訴自己一件事,沉下心,沉注氣。

            posted on 2008-03-01 17:15 李侃 閱讀(1793) 評(píng)論(4)  編輯 收藏 引用 所屬分類(lèi): 網(wǎng)絡(luò)模塊

            評(píng)論

            # re: 這段時(shí)間加入了網(wǎng)絡(luò)序列化的功能  回復(fù)  更多評(píng)論   

            不知道具體實(shí)現(xiàn),應(yīng)該只要基本的序列化機(jī)制即可,模板都可以不用,實(shí)現(xiàn)是不是復(fù)雜了點(diǎn)?
            2008-03-01 22:42 | giscn

            # re: 這段時(shí)間加入了網(wǎng)絡(luò)序列化的功能  回復(fù)  更多評(píng)論   

            具體實(shí)現(xiàn)就不發(fā)上來(lái)了,給你看一段測(cè)試的代碼,模版的好處太多了

            template <typename T>
            void TestSerialize(T& val, bool enableTag)
            {
            ObjectStream s(enableTag);
            StreamBuffer buf;
            DWORD size = s.GetLength(val);
            buf.realloc(size);

            // write
            assert( s.BeginWriting(&buf) );
            assert( s.Write(val) );
            assert( s.EndWriting() );

            DumpBuffer(buf);

            // read
            T val_read;
            assert( s.BeginReading(&buf) );
            assert( s.Read(val_read) );
            assert( s.EndReading() );

            // nothing left to read
            assert( buf.GetRestLength() == 0 );

            // we read what we wrote
            assert( val == val_read );
            }

            class Foo:public SerializeObject
            {
            public:
            Foo(){
            ZeroMemory(m_chr, 20);}

            void Init(const std::string& s, const std::vector<DWORD>& v, DWORD d, const char * chr)
            {
            m_s = s;
            m_v = v;
            m_d = d;
            strcpy(m_chr, chr);
            }

            bool operator==(const SerializeObject &other) const
            {

            return m_d == ((Foo&)other).m_d &&
            m_v == ((Foo&)other).m_v &&
            m_s == ((Foo&)other).m_s &&
            strcmp(m_chr, ((Foo&)other).m_chr)==0;
            }

            SerializeTag ComputeTag()
            {
            return eTAG_USERCLASS;
            }


            bool Write(ObjectStream& stream)
            {
            return stream.Write(m_d) &&
            stream.Write(m_s) &&
            stream.Write(m_v) &&
            stream.WriteRaw(m_chr, (DWORD) strlen(m_chr));
            }

            bool Read(ObjectStream& stream)
            {
            return stream.Read(m_d) &&
            stream.Read(m_s) &&
            stream.Read(m_v) &&
            stream.ReadRaw((void *)m_chr);
            }

            DWORD GetLength(ObjectStream& stream)
            {
            return stream.GetLength(m_d) +
            stream.GetLength(m_s) +
            stream.GetLength(m_v) +
            stream.GetRawLength((DWORD) strlen(m_chr));
            }

            public:
            DWORD m_d;
            std::string m_s;
            std::vector<DWORD> m_v;
            char m_chr[100];
            };

            void TestUserDefclass()
            {
            printf("test UserDefclass:\r\n");
            printf("====================================\r\n");

            printf("test User Def Class Foo with tags and no tags \r\n");
            printf("---------------------------------\r\n");
            Foo foo;
            std::vector<DWORD> v;
            v.push_back(1);
            v.push_back(2);
            char strs[20];
            strcpy(strs, "jack");

            foo.Init("hello", v, 3, strs);

            TestSerialize(foo, true);
            TestSerialize(foo, false);
            }

            void testSTL
            {

            printf("test std::set with tags and no tags \r\n");
            printf("---------------------------------\r\n");
            std::set<DWORD> st;
            st.insert(9);
            st.insert(11);
            st.insert(10);
            TestSerialize(st, true);
            TestSerialize(st, false);
            printf("\r\n");
            }

            ObjectStream 可以讀和寫(xiě)任何類(lèi)型的對(duì)象到StreamBuffer(StreamBuffer里面有個(gè)char[],二進(jìn)制序列存這里)中去,這都?xì)w功于模版啊,
            2008-03-02 13:21 | 李侃

            # re: 這段時(shí)間加入了網(wǎng)絡(luò)序列化的功能  回復(fù)  更多評(píng)論   

            自己寫(xiě)的還是贊一個(gè).

            不過(guò)我喜歡用BOOST的序列化.

            http://www.boost.org/libs/serialization/doc/index.html

            2008-03-03 08:54 | 橙子

            # re: 這段時(shí)間加入了網(wǎng)絡(luò)序列化的功能  回復(fù)  更多評(píng)論   

            恩,好像大家都這么說(shuō),有時(shí)間的話,我也去看看Boost的序列化的源碼,看看有什么更好的可取之處
            2008-03-06 16:47 | 李侃
            亚洲精品tv久久久久| 香蕉久久夜色精品国产小说| 国内精品伊人久久久久妇| 久久精品成人欧美大片| 国产精品久久久久jk制服| 精品久久人人爽天天玩人人妻| 久久男人中文字幕资源站| 久久99精品国产自在现线小黄鸭| 国产农村妇女毛片精品久久| 久久久久久亚洲Av无码精品专口| 精品水蜜桃久久久久久久| 色偷偷久久一区二区三区| 国内精品久久久久久久影视麻豆 | 久久精品国产亚洲av水果派 | 久久精品国产色蜜蜜麻豆| 久久久精品人妻一区二区三区蜜桃 | 精品伊人久久大线蕉色首页| 免费观看久久精彩视频| 久久精品国产亚洲AV麻豆网站| 久久久精品久久久久特色影视| 91精品国产91久久久久福利| 三级三级久久三级久久| 久久久精品视频免费观看| 亚洲欧美精品伊人久久| 国内精品人妻无码久久久影院| 伊人色综合久久天天人手人婷 | 91久久精品国产91性色也| 久久不见久久见免费视频7| 欧美亚洲国产精品久久高清 | 久久久久国产一级毛片高清版| 色偷偷偷久久伊人大杳蕉| 亚洲AV无码久久寂寞少妇| 久久精品中文字幕一区| 99久久做夜夜爱天天做精品| 99久久香蕉国产线看观香| 久久人人爽人人爽人人片AV高清| 性做久久久久久久久浪潮| 久久人与动人物a级毛片| 中文国产成人精品久久不卡| 久久久久久久波多野结衣高潮| 久久精品国产亚洲AV不卡|