首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Vczh Library 序列化框架:跨網路傳遞多型物件完整實作

     編輯:關於C++

架構設計動機

C++ 模板缺乏執行期型別資訊(RTTI 僅支援多型基類),難以直接序列化容器內的多型物件。Vczh Library 採用宏標註欄位 + 執行期型別登記機制,實現非侵入式、支援多型與容器的高效序列化。

核心類別定義

class Node : public VL_SerializableObject {
public:
    typedef VL_AutoPtr<Node> Ptr;
    virtual VUnicodeString ToString(VUnicodeString Prefix) = 0;
};

class NumberNode : public Node {
public:
    VInt Number;
    NumberNode() { VL_SERIALIZABLE_FIELD(NumberNode, Number); }
    VUnicodeString ToString(VUnicodeString Prefix) override {
        return Prefix + VUnicodeString(Number);
    }
};

class IdNode : public Node {
public:
    VUnicodeString Id;
    IdNode() { VL_SERIALIZABLE_FIELD(IdNode, Id); }
    VUnicodeString ToString(VUnicodeString Prefix) override {
        return Prefix + Id;
    }
};

class ListNode : public Node {
public:
    VL_List<Ptr, false, Node*> Children;  // 容器支援多型指標
    ListNode() { VL_SERIALIZABLE_FIELD(ListNode, Children); }
    VUnicodeString ToString(VUnicodeString Prefix) override {
        VUnicodeString Result = Prefix + L"List {\r\n";
        for (VInt i = 0; i < Children.GetCount(); ++i) {
            Result += Children[i] ? Children[i]->ToString(Prefix + L" ") + L"\r\n"
                                  : Prefix + L" <NULL>\r\n";
        }
        return Result + Prefix + L"}";
    }
};

序列化器初始化

void InitializeSerializer(VL_Serializer& Serializer) {
    VL_SERIALIZABLE_CLASS(&Serializer, NumberNode);
    VL_SERIALIZABLE_CLASS(&Serializer, IdNode);
    VL_SERIALIZABLE_CLASS(&Serializer, ListNode);
}

伺服器端:建構樹並發送

Node::Ptr BuildNode() {
    ListNode* Root = new ListNode;
    Root->Children.Add(new NumberNode{10});
    ListNode* List = new ListNode;
    List->Children.Add(new NumberNode{20});
    List->Children.Add(nullptr);  // 支援空指標
    List->Children.Add(new IdNode{L"Serialization"});
    Root->Children.Add(List);
    Root->Children.Add(new IdNode{L"VCZH"});
    return Root;
}

void ServerMain() {
    VL_Serializer Serializer; InitializeSerializer(Serializer);
    VL_SocketServer Server(vspTCP, L"8000", false);
    if (Server.IsSuccess()) {
        VL_ServerSocket* Socket = Server.WaitForConnection();
        if (Socket) {
            Node::Ptr MyNode = BuildNode();
            WriteCommonObject(Socket->GetWriterStream(), Serializer.Serialize(MyNode.Object()));
            delete Socket;
        }
    }
}

客戶端:接收並反序列化

void ClientMain() {
    VL_Serializer Serializer; InitializeSerializer(Serializer);
    VL_ClientSocket Socket(vspTCP, L"127.0.0.1", L"8000");
    if (Socket.Connect()) {
        Node::Ptr MyNode = Serializer.Deserialize(ReadCommonObject(Socket.GetReaderStream()));
        GetConsole()->Write(MyNode->ToString(L""));
    }
}

單一執行檔雙模式啟動

void vlmain() {
    VL_SynEvent Event;
    switch (Event.Create(false, false, L"VCZH")) {
        case VL_SynObject::arSucceed:      ServerMain(); break;  // 首次啟動 → Server
        case VL_SynObject::arAlreadyExists: ClientMain(); break; // 二次啟動 → Client
        case VL_SynObject::arFail: /* 錯誤處理 */ break;
    }
}

執行結果

List {
 10
 List {
  20
  <NULL>
  Serialization
 }
 VCZH
}

關鍵技術點總結

  • 多型序列化:基類繼承 VL_SerializableObject,宏登記具體型別,反序列化自動還原動態型別。
  • 容器支援:VL_List<Ptr> 直接序列化智慧指標容器,保留物件擁有權語意。
  • 空指標處理:容器允許 nullptr,序列化/反序列化正確保留。
  • 同步原語:VL_SynEvent 實現單一執行檔自動協商 Server/Client 角色。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved