Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从基类发送和接收序列化类_C++_Sockets_Serialization_Boost_Polymorphism - Fatal编程技术网

C++ 从基类发送和接收序列化类

C++ 从基类发送和接收序列化类,c++,sockets,serialization,boost,polymorphism,C++,Sockets,Serialization,Boost,Polymorphism,我的目标是创建一个基类,该基类具有以下方法: 1.序列化并发送到服务器 2.从服务器序列化字节读回 3.从序列化字节重新创建自身 这是为了避免第二个类序列化、发送、读回并重新创建类的结果 在将来可能需要的每个继承类的通信中影响构建。任何继承类都不需要创建发送/接收方法,因为基类已经具有该方法。他们只需要使用void serialize(Ar&,unsigned)方法,boost就可以完成序列化 我的问题是在下面的保存方法中,archive save()//保存到字符串 原始连接。陶粒(objTo

我的目标是创建一个基类,该基类具有以下方法: 1.序列化并发送到服务器 2.从服务器序列化字节读回 3.从序列化字节重新创建自身

这是为了避免第二个类序列化、发送、读回并重新创建类的结果

在将来可能需要的每个继承类的通信中影响构建。任何继承类都不需要创建发送/接收方法,因为基类已经具有该方法。他们只需要使用
void serialize(Ar&,unsigned)
方法,boost就可以完成序列化

我的问题是在下面的保存方法中,
archive save()//保存到字符串
原始连接。陶粒(objToSendStr)//向服务器发送字符串;服务器做一些工作
protoConnection.DoRead()//将结果从服务器读回到对象连接中的字符串
std::string returnedObjectStr=protoConnection.getTotalMessage()//将读取的字节保存为字符串
std::unique_ptr objectReturned=this->load(returnedObjectStr);
返回对象返回;
}
私人:
好友类boost::serialization::access;
模板
无效序列化(Ar&,无符号){}//从aTodo继承的每个类都必须有一个序列化函数
//将指向此的指针保存到字符串
std::string save(){
std::字符串输出;
{
boost::iostreams::streamos(out);
boost::archive::text\u oarchive归档(os);
存档>p;
}
返回std::move(p);
}
};
#恩迪夫

你很好。只要您通过指针序列化(您就可以) 还有,你很好


当然,API设计中存在一些值得注意的问题(
load
可能是静态的;
getTotalMessage
可能不应该与
DoRead
等分离)

非常感谢您。你已经回答了我的很多boost问题。你认为load()写到“this”指针而不是另一个指针怎么样?@user249806我想你忘了你不能。它将如何动态构造适当的子类型?您是正确的。我将把它改为静态。谢谢你的建议和解释。我个人觉得这不应该在基础课上。它违反了单一责任原则。这段代码应该在另一个类中,该类负责从服务器保存和加载对象。“但那不是你要的。”多米尼克·康多奈尔我有点同意。我不介意它出现在那里,但它会导致更粗糙的代码。此外,真正的问题可以通过简单的尝试来回答:)@DominicMcDonnell为什么那样会不那么粗糙。我想这对我来说会更容易。创建aTodoInherited。2.调用aTodoInherited.writeRead()。你是在建议我在另一个类中创建一些静态方法来处理发送和接收,这样就不会那么混乱了?当我写这篇文章时,我明白你的意思了。我需要谷歌单一责任原则…我建议你有一些其他的类来管理服务器连接和读/写。没有理由让它是静态的。这将从这个特定的类中删除这个类的代码,清理它并使其更容易推理,这使得查找bug更容易,而且如果您有其他类,您可以更容易地重用代码。这个类中唯一需要的是serialise方法。查阅单一责任原则,它将提高您的代码设计技能。
#ifndef ATODO_H
#define ATODO_H
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/export.hpp>
#include <boost/serialization/unique_ptr.hpp>

#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
#include "protocolBaseServer.h"
#include "memory.h"
class aTodo{
  public:
   virtual ~aTodo(){};
   virtual void Do()=0;

   //used for a client to send and then receive result back
   std::unique_ptr<aTodo>  WriteRead(std::string ip, int port){

    protocolBaseServer protoConnection(ip, port);
    std::string objToSendStr = this->save(); //save to a string
    protoConnection.DoWrite(objToSendStr);//send string off to server; server does some work
    protoConnection.DoRead();  //read back in the result from the server to a string in object protoConnection
    std::string returnedObjectStr= protoConnection.getTotalMessage(); //save the read bytes to a string
    std::unique_ptr<aTodo> objectReturned=this->load(returnedObjectStr);
    return objectReturned;
   }

   private:

   friend class boost::serialization::access;
   template  <class Ar>
   void serialize(Ar &, unsigned){};//every class that inherits from aTodo must have a serialize function

//save pointer to this to a string
   std::string save(){
         std::string out;
         {
            boost::iostreams::stream<boost::iostreams::back_insert_device<std::string>>os(out);
            boost::archive::text_oarchive archive(os);

            archive << this;
         }
         return out;
   }
//write aTodo pointer from string
   std::unique_ptr<aTodo> load(std::string const &s ){
         std::unique_ptr<aTodo> p;
         {
            boost::iostreams::stream<boost::iostreams::array_source> is(boost::iostreams::array_source{s.data(),s.size()});
            boost::archive::text_iarchive archive(is);
            archive >> p;

         }
         return std::move(p);

  }


};
#endif