• <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>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                今天將Serialization進(jìn)行了重構(gòu),讓其支持容器。于是使用以前的基礎(chǔ)設(shè)施就能完成這個Demo了。

                為什么要做成這個樣子呢?因為模板沒有運行時匹配功能。雖然仍然大量使用模板,但是接口上就沒有了。模板被用來處理其他的事情。

                這個程序分為服務(wù)器端和客戶端兩個部分,使用Socket連接。服務(wù)器端監(jiān)聽到一個客戶端之后將一棵樹發(fā)送過去之后退出。客戶端接收到這棵樹之后將內(nèi)容打印到屏幕上。于是我們實現(xiàn)一顆多態(tài)的樹。樹的節(jié)點分為數(shù)字節(jié)點、字符串節(jié)點和列表節(jié)點三種,共同繼承自一個基類。這樣的話就可以使用多態(tài)來構(gòu)造成一棵樹并進(jìn)行操作了:
             1 class Node : public VL_SerializableObject
             2 {
             3 public:
             4     typedef VL_AutoPtr<Node> Ptr;
             5 
             6     virtual VUnicodeString ToString(VUnicodeString Prefix)=0;
             7 };
             8 
             9 class NumberNode : public Node
            10 {
            11 public:
            12     VInt Number;
            13 
            14     NumberNode()
            15     {
            16         VL_SERIALIZABLE_FIELD(NumberNode,Number);
            17     }
            18 
            19     VUnicodeString ToString(VUnicodeString Prefix)
            20     {
            21         return Prefix+VUnicodeString(Number);
            22     }
            23 };
            24 
            25 class IdNode : public Node
            26 {
            27 public:
            28     VUnicodeString Id;
            29 
            30     IdNode()
            31     {
            32         VL_SERIALIZABLE_FIELD(IdNode,Id);
            33     }
            34 
            35     VUnicodeString ToString(VUnicodeString Prefix)
            36     {
            37         return Prefix+Id;
            38     }
            39 };
            40 
            41 class ListNode : public Node
            42 {
            43 public:
            44     VL_List<Ptr , false , Node*> Children;
            45 
            46     ListNode()
            47     {
            48         VL_SERIALIZABLE_FIELD(ListNode,Children);
            49     }
            50 
            51     VUnicodeString ToString(VUnicodeString Prefix)
            52     {
            53         VUnicodeString Result;
            54         Result+=Prefix+L"List  {\r\n";
            55         for(VInt i=0;i<Children.GetCount();i++)
            56         {
            57             if(Children[i])
            58             {
            59                 Result+=Children[i]->ToString(Prefix+L"    ")+L"\r\n";
            60             }
            61             else
            62             {
            63                 Result+=Prefix+L"    <NULL>\r\n";
            64             }
            65         }
            66         Result+=Prefix+L"}";
            67         return Result;
            68     }
            69 };

                接下來初始化Serializer:
            1 void InitializeSeriailzer(VL_Serializer& Serializer)
            2 {
            3     VL_SERIALIZABLE_CLASS(&Serializer,NumberNode);
            4     VL_SERIALIZABLE_CLASS(&Serializer,IdNode);
            5     VL_SERIALIZABLE_CLASS(&Serializer,ListNode);
            6 }

                然后實現(xiàn)一個服務(wù)器端的邏輯:
             1 Node::Ptr BuildNode()
             2 {
             3     ListNode* Root=new ListNode;
             4     {
             5         NumberNode* Number=new NumberNode;
             6         Number->Number=10;
             7         Root->Children.Add(Number);
             8     }
             9     {
            10         ListNode* List=new ListNode;
            11         {
            12             NumberNode* Number=new NumberNode;
            13             Number->Number=20;
            14             List->Children.Add(Number);
            15         }
            16         List->Children.Add(0);
            17         {
            18             IdNode* Id=new IdNode;
            19             Id->Id=L"Serialization";
            20             List->Children.Add(Id);
            21         }
            22         Root->Children.Add(List);
            23     }
            24     {
            25         IdNode* Id=new IdNode;
            26         Id->Id=L"VCZH";
            27         Root->Children.Add(Id);
            28     }
            29     return Root;
            30 }
            31 
            32 void ServerMain()
            33 {
            34     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Communication [Server]");
            35 
            36     VL_Serializer Serializer;
            37     InitializeSeriailzer(Serializer);
            38 
            39     VL_SocketServer Server(vspTCP,L"8000",false);
            40     if(Server.IsSuccess())
            41     {
            42         VL_ServerSocket* Socket=Server.WaitForConnection();
            43         if(Socket)
            44         {
            45             GetConsole()->Write(L"監(jiān)聽到客戶端。\r\n");
            46             Node::Ptr MyNode=BuildNode();
            47             WriteCommonObject(Socket->GetWriterStream(),Serializer.Serialize(MyNode.Object()));
            48             delete Socket;
            49             GetConsole()->Write(L"發(fā)送成功,關(guān)閉服務(wù)端。\r\n");
            50         }
            51         else
            52         {
            53             GetConsole()->Write(L"監(jiān)聽端口時發(fā)生錯誤。\r\n");
            54         }
            55     }
            56     else
            57     {
            58             GetConsole()->Write(L"創(chuàng)建Socket時發(fā)生錯誤。\r\n");
            59     }
            60 }

                下面是客戶端的邏輯:
             1 void ClientMain()
             2 {
             3     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Communication [Client]");
             4 
             5     VL_Serializer Serializer;
             6     InitializeSeriailzer(Serializer);
             7 
             8     VL_ClientSocket Socket(vspTCP,L"127.0.0.1",L"8000");
             9     if(Socket.Connect())
            10     {
            11         GetConsole()->Write(L"連接到服務(wù)端。\r\n");
            12         Node::Ptr MyNode=Serializer.Deserialize(ReadCommonObject(Socket.GetReaderStream()));
            13         GetConsole()->Write(MyNode->ToString(L""));
            14     }
            15     else
            16     {
            17         GetConsole()->Write(L"連接服務(wù)端時發(fā)生錯誤。\r\n");
            18     }
            19 }

                最后用Main函數(shù)來構(gòu)造一個Event。程序?qū)⒈粏觾纱危葐拥某蔀榉?wù)器,后啟動的成為客戶端,方便將兩部分的代碼都放在同一個文件里面:
             1 void vlmain()
             2 {
             3     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Communication");
             4     GetConsole()->SetTestMemoryLeaks(true);
             5     GetConsole()->SetPauseOnExit(true);
             6 
             7     VL_SynEvent Event;
             8     switch(Event.Create(false,false,L"VCZH"))
             9     {
            10     case VL_SynObject::arSucceed:
            11         ServerMain();
            12         break;
            13     case VL_SynObject::arAlreadyExists:
            14         ClientMain();
            15         break;
            16     case VL_SynObject::arFail:
            17         GetConsole()->Write(L"構(gòu)造Event時發(fā)生錯誤。\r\n");
            18         break;
            19     }
            20 }

                讓我們看看運行結(jié)果:


                下面是完整的代碼:
              1 #include "..\..\..\Library\Platform\VL_Console.h"
              2 #include "..\..\..\Library\Data\VL_CommonData.h"
              3 #include "..\..\..\Library\Data\VL_Serialization.h"
              4 #include "..\..\..\Library\Data\VL_Communication.h"
              5 #include "..\..\..\Library\Data\VL_Stream.h"
              6 #include "..\..\..\Library\Data\VL_System.h"
              7 
              8 using namespace vl;
              9 using namespace vl::platform;
             10 using namespace vl::stream;
             11 using namespace vl::system;
             12 using namespace vl::system::synchronization;
             13 using namespace vl::serialization;
             14 using namespace vl::commondata;
             15 using namespace vl::communication;
             16 
             17 class Node : public VL_SerializableObject
             18 {
             19 public:
             20     typedef VL_AutoPtr<Node> Ptr;
             21 
             22     virtual VUnicodeString ToString(VUnicodeString Prefix)=0;
             23 };
             24 
             25 class NumberNode : public Node
             26 {
             27 public:
             28     VInt Number;
             29 
             30     NumberNode()
             31     {
             32         VL_SERIALIZABLE_FIELD(NumberNode,Number);
             33     }
             34 
             35     VUnicodeString ToString(VUnicodeString Prefix)
             36     {
             37         return Prefix+VUnicodeString(Number);
             38     }
             39 };
             40 
             41 class IdNode : public Node
             42 {
             43 public:
             44     VUnicodeString Id;
             45 
             46     IdNode()
             47     {
             48         VL_SERIALIZABLE_FIELD(IdNode,Id);
             49     }
             50 
             51     VUnicodeString ToString(VUnicodeString Prefix)
             52     {
             53         return Prefix+Id;
             54     }
             55 };
             56 
             57 class ListNode : public Node
             58 {
             59 public:
             60     VL_List<Ptr , false , Node*> Children;
             61 
             62     ListNode()
             63     {
             64         VL_SERIALIZABLE_FIELD(ListNode,Children);
             65     }
             66 
             67     VUnicodeString ToString(VUnicodeString Prefix)
             68     {
             69         VUnicodeString Result;
             70         Result+=Prefix+L"List  {\r\n";
             71         for(VInt i=0;i<Children.GetCount();i++)
             72         {
             73             if(Children[i])
             74             {
             75                 Result+=Children[i]->ToString(Prefix+L"    ")+L"\r\n";
             76             }
             77             else
             78             {
             79                 Result+=Prefix+L"    <NULL>\r\n";
             80             }
             81         }
             82         Result+=Prefix+L"}";
             83         return Result;
             84     }
             85 };
             86 
             87 void InitializeSeriailzer(VL_Serializer& Serializer)
             88 {
             89     VL_SERIALIZABLE_CLASS(&Serializer,NumberNode);
             90     VL_SERIALIZABLE_CLASS(&Serializer,IdNode);
             91     VL_SERIALIZABLE_CLASS(&Serializer,ListNode);
             92 }
             93 
             94 Node::Ptr BuildNode()
             95 {
             96     ListNode* Root=new ListNode;
             97     {
             98         NumberNode* Number=new NumberNode;
             99         Number->Number=10;
            100         Root->Children.Add(Number);
            101     }
            102     {
            103         ListNode* List=new ListNode;
            104         {
            105             NumberNode* Number=new NumberNode;
            106             Number->Number=20;
            107             List->Children.Add(Number);
            108         }
            109         List->Children.Add(0);
            110         {
            111             IdNode* Id=new IdNode;
            112             Id->Id=L"Serialization";
            113             List->Children.Add(Id);
            114         }
            115         Root->Children.Add(List);
            116     }
            117     {
            118         IdNode* Id=new IdNode;
            119         Id->Id=L"VCZH";
            120         Root->Children.Add(Id);
            121     }
            122     return Root;
            123 }
            124 
            125 void ServerMain()
            126 {
            127     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Communication [Server]");
            128 
            129     VL_Serializer Serializer;
            130     InitializeSeriailzer(Serializer);
            131 
            132     VL_SocketServer Server(vspTCP,L"8000",false);
            133     if(Server.IsSuccess())
            134     {
            135         VL_ServerSocket* Socket=Server.WaitForConnection();
            136         if(Socket)
            137         {
            138             GetConsole()->Write(L"監(jiān)聽到客戶端。\r\n");
            139             Node::Ptr MyNode=BuildNode();
            140             WriteCommonObject(Socket->GetWriterStream(),Serializer.Serialize(MyNode.Object()));
            141             delete Socket;
            142             GetConsole()->Write(L"發(fā)送成功,關(guān)閉服務(wù)端。\r\n");
            143         }
            144         else
            145         {
            146             GetConsole()->Write(L"監(jiān)聽端口時發(fā)生錯誤。\r\n");
            147         }
            148     }
            149     else
            150     {
            151             GetConsole()->Write(L"創(chuàng)建Socket時發(fā)生錯誤。\r\n");
            152     }
            153 }
            154 
            155 void ClientMain()
            156 {
            157     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Communication [Client]");
            158 
            159     VL_Serializer Serializer;
            160     InitializeSeriailzer(Serializer);
            161 
            162     VL_ClientSocket Socket(vspTCP,L"127.0.0.1",L"8000");
            163     if(Socket.Connect())
            164     {
            165         GetConsole()->Write(L"連接到服務(wù)端。\r\n");
            166         Node::Ptr MyNode=Serializer.Deserialize(ReadCommonObject(Socket.GetReaderStream()));
            167         GetConsole()->Write(MyNode->ToString(L""));
            168     }
            169     else
            170     {
            171         GetConsole()->Write(L"連接服務(wù)端時發(fā)生錯誤。\r\n");
            172     }
            173 }
            174 
            175 void vlmain()
            176 {
            177     GetConsole()->SetTitle(L"Vczh Library++ 2.0 Communication");
            178     GetConsole()->SetTestMemoryLeaks(true);
            179     GetConsole()->SetPauseOnExit(true);
            180 
            181     VL_SynEvent Event;
            182     switch(Event.Create(false,false,L"VCZH"))
            183     {
            184     case VL_SynObject::arSucceed:
            185         ServerMain();
            186         break;
            187     case VL_SynObject::arAlreadyExists:
            188         ClientMain();
            189         break;
            190     case VL_SynObject::arFail:
            191         GetConsole()->Write(L"構(gòu)造Event時發(fā)生錯誤。\r\n");
            192         break;
            193     }
            194 }
            posted on 2008-11-22 02:26 陳梓瀚(vczh) 閱讀(2142) 評論(6)  編輯 收藏 引用 所屬分類: C++

            評論:
            # re: Vczh Serialization Demo :在網(wǎng)絡(luò)上傳遞復(fù)雜對象 2008-11-22 03:57 | 肥仔
            都依賴于自己造的輪子,對別沒有價值,除非別人愿意用你的輪子。否則也就落到自娛自樂了。  回復(fù)  更多評論
              
            # re: Vczh Serialization Demo :在網(wǎng)絡(luò)上傳遞復(fù)雜對象 2008-11-22 04:00 | 陳梓瀚(vczh)
            其實,支持了std::string你就不能支持wxString。你難道可以做一個庫同時支持所有流行的庫的string?

            道理是一樣的,我只選擇一個來支持。不過事實上想擴(kuò)展并且支持其他容器或類型也很容易的,只需要再特化一點模板就行了,對庫來說不用侵入式修改。  回復(fù)  更多評論
              
            # re: Vczh Serialization Demo :在網(wǎng)絡(luò)上傳遞復(fù)雜對象 2008-11-22 18:00 | 螞蟻終結(jié)者
            8 using namespace vl;
            9 using namespace vl::platform;
            10 using namespace vl::stream;
            11 using namespace vl::system;
            12 using namespace vl::system::synchronization;
            13 using namespace vl::serialization;
            14 using namespace vl::commondata;
            15 using namespace vl::communication;
            居然都是自己封裝的。。。難道是想模擬C#  回復(fù)  更多評論
              
            # re: Vczh Serialization Demo :在網(wǎng)絡(luò)上傳遞復(fù)雜對象 2008-11-22 23:22 | 陳梓瀚(vczh)
            本不想模擬的,但是做到最后又很像,只能說明c#的庫很合理吧……

            但其實是很不像的,除了WinForm那部分……  回復(fù)  更多評論
              
            # re: Vczh Serialization Demo :在網(wǎng)絡(luò)上傳遞復(fù)雜對象 2008-11-26 06:28 | E劍仙
            很快Native C++下就有VCZH.NET庫可以使用了……  回復(fù)  更多評論
              
            # re: Vczh Serialization Demo :在網(wǎng)絡(luò)上傳遞復(fù)雜對象 2008-12-15 18:07 | 123
            好厲害的孩子!!!!!!!!!!  回復(fù)  更多評論
              
            中文字幕无码久久久| 狠狠色综合网站久久久久久久高清| 色妞色综合久久夜夜| 思思久久99热只有频精品66| 久久久久久极精品久久久| 精品国产91久久久久久久a| 99久久精品免费看国产| 国产精品免费久久久久久久久 | 欧美日韩精品久久久免费观看| 久久久久久噜噜精品免费直播| 久久人人爽人人精品视频| 久久亚洲精品无码播放| 亚洲精品午夜国产va久久| 欧美国产成人久久精品| 亚洲伊人久久精品影院 | 久久99国产精品尤物| 亚洲愉拍99热成人精品热久久| 久久综合88熟人妻| 久久天堂电影网| 欧美久久综合九色综合| 精品多毛少妇人妻AV免费久久| 99久久无色码中文字幕人妻| 99久久99这里只有免费的精品| 66精品综合久久久久久久| 久久久精品波多野结衣| 波多野结衣久久一区二区| 久久亚洲精品无码AV红樱桃| 色综合久久最新中文字幕| 日批日出水久久亚洲精品tv| 久久久久免费精品国产| 久久91精品国产91久久小草| 久久精品国产一区二区电影| 精品综合久久久久久98| 久久国产精品久久久| 亚洲国产精品一区二区三区久久 | 久久久久人妻一区精品| 亚洲AV无码1区2区久久| 99热都是精品久久久久久| 国内精品综合久久久40p| 久久久久久久尹人综合网亚洲 | jizzjizz国产精品久久|