使用RabbitMQ放置自己定義對象(不借助序列化工具,比如protobuffer)V2.0
阿新 • • 發佈:2017-06-26
還原 pac 數據 展示 投放 模型 例如 erp per
main.cpp
這裏只展示了思路,詳細的MQ封裝是自己封裝的和標準的MQ不太一樣,封裝版本號見:
怎樣使用RabbitMQ盛放自己定義的對象呢?一般都會使用序列化工具在投放之前轉換一次。從MQ取回的時候再逆序列化還原為本地對象。這裏使用C++自帶的強制類型裝換,將本地對象的內存模型當做自然的序列化之後的數據,直接當做字節流放到string對象中,從MQ取回的時候用相同的方法再將string對象強制當做字節流轉換為本地對象。
直接使用。非常棒
註意:這樣的思路事實上有一個缺點就是本地上傳,取回本地使用肯定是沒問題的。假設本地上傳,其它機器使用(本地是大端機器,其它機器是小端機器)就可能有問題,這也是序列化保證跨語言。跨機器的地方。
Student.h
#pragma once #include <string> using namespace std; #include <iostream> class Student { public: Student(void); ~Student(void); string id(void) const ; void id(const string& id); int age(void) const ; void age(const int age); char* name(void) const ; void name(const char* name); char sex(void) const ; void sex(const char sex); friend ostream& operator<< (ostream& os ,const Student& stu); private: Student(const Student&); Student& operator=(const Student&); string id_; int age_; char name_[10]; char sex_; };
Student.cpp
#include "Student.h" Student::Student(void):sex_(0),age_(0) { for (int i=0 ;i< 10;i++) { name_[i] = 0; } } Student::~Student(void) { } string Student::id(void) const { return id_; } void Student::id(const string& id) { this->id_ = id; } int Student::age(void) const { return age_; } void Student::age(const int age) { age_ = age ; } char* Student::name(void) const { return (char*)name_; } void Student::name(const char* name) { char* pname = this->name_; while((*pname++ = *name++) != ‘\0‘) { } } char Student::sex(void) const { return sex_; } void Student::sex(const char sex) { sex_ = sex; } ostream& operator<<(ostream& os ,const Student& stu) { os<<"id : "<<stu.id() <<" name : "<<stu.name() <<" sex : "<<stu.sex() <<" age : "<<stu.age()<<endl; return os; }
main.cpp
#include "Student.h" #include "RabbitMQ.h" #include <vector> int main(int, char *[]) { Student s; cout<<s<<endl; s.id("SCP001"); s.name("zhangsan"); s.age(24); s.sex(‘M‘); cout<<s<<endl; vector<string> stu_array; //for (int i=0;i<10;i++) //{ // string string_stu(reinterpret_cast<const char*>(&s),reinterpret_cast<const char*>(&s) + sizeof(Student)); // stu_array.push_back(string_stu); //} CRabbitMQ pro; CExchange exchange("exchange"); string queue_name("queue"); //mq::publish(stu_array,pro,exchange,queue_name); //cout<<"已經將students提交至MQserver"<<endl; stu_array.clear(); mq::consume(stu_array,pro,exchange,queue_name); cout<<"例如以下是從MQserver取回的Students"<<endl; for(int i=0;i<stu_array.size();i++) { Student* pstu = (Student*)stu_array[i].c_str() ; cout<<*pstu<<endl; } //char* ps = (char*)&s; //string string_stu(reinterpret_cast<const char*>(&s),reinterpret_cast<const char*>(&s) + sizeof(Student)); //Student* pstu = (Student*)string_stu.c_str(); //cout<<*pstu<<endl; return 0; };
這裏只展示了思路,詳細的MQ封裝是自己封裝的和標準的MQ不太一樣,封裝版本號見:
http://blog.csdn.net/calmreason/article/details/23346397
使用RabbitMQ放置自己定義對象(不借助序列化工具,比如protobuffer)V2.0