今天将Serialization进行了重构,让其支持容器。于是使用以前的基础设施就能完成这 个Demo了。
为什么要做成这个样子呢?因为模板没有运行时匹配功能。虽然仍然大量 使用模板,但是接口上就没有了。模板被用来处理其他的事情。
这个程序分为服务器 端和客户端两个部分,使用Socket连接。服务器端监听到一个客户端之后将一棵树发送过去 之后退出。客户端接收到这棵树之后将内容打印到屏幕上。于是我们实现一颗多态的树。树 的节点分为数字节点、字符串节点和列表节点三种,共同继承自一个基类。这样的话就可以 使用多态来构造成一棵树并进行操作了:
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 }
然后实现一个服务器端的逻辑:
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-&g |