读取\写入boost :: binary_oarchive到管道

时间:2008-12-25 22:26:07

标签: c++ windows visual-studio-2005 boost pipe

我将继续构建两个简单的进程,通过简单(匿名)管道将类对象彼此抛出(请参阅我之前的帖子)。现在我为自己启示了boost :: serialization(感谢回答的人),并尝试通过:: WriteFile :: ReadFile使一些类序列化。那么 - 我做错了什么?


1)我创建了一些类

 #pragma once
 #include "wtypes.h"
 #include <boost\archive\binary_oarchive.hpp>
 #include <boost\archive\binary_iarchive.hpp>
 #include <boost\serialization\binary_object.hpp>

 class CTextContainer
 {
 friend class boost::serialization::access;
     template<class Archive>
     void serialize(Archive & ar, const unsigned int version)
     {
         ar & m_sText;
         ar & m_dwCRC;
         ar & m_dwSize;
     }

 public:
      CTextContainer() : m_dwCRC(0), m_dwSize(0)
      {
          ZeroMemory(m_sText, sizeof(m_sText));
          m_dwSize = sizeof(*this);
      }
      CTextContainer(LPCTSTR sText) : m_dwCRC(0), m_dwSize(0)
      {
         ZeroMemory(m_sText, sizeof(m_sText));
         wcsncpy_s(m_sText, 1024, sText, wcslen(sText));
         m_dwSize = sizeof(*this);
      }
      virtual ~CTextContainer(){}
      LPTSTR GetText() const{return (LPTSTR) m_sText;}
      protected:
      DWORD m_dwCRC;
      DWORD m_dwSize;
      TCHAR m_sText[1024];
 }; //end of class

2)现在我试图从这个类读入二进制存档并将其内容写入管道的一端......

boost::archive::binary_oarchive oa(ofs);
oa << tc;
::WriteFile(hPipe, &oa, dwRead, &dwWritten, NULL) == FALSE 

这不会那样,对吧?那么,它会怎样?

3)另一边的操作相同吗?

2 个答案:

答案 0 :(得分:1)

我认为这里的问题是你正在尝试将指针传递给WriteFile函数中的归档对象。你应该做的是提供一个指向序列化数据的指针。

std::stringstream ss;
boost::archive::binary_oarchive oa(ss);
oa << tc;
::WriteFile(hPipe, ss.str().data(), ss.str().data().size(), &dwWritten, NULL)

作为更好的替代方案,您应该为binary_oarchive构造函数提供一个直接写入文件句柄的ostream实现。

答案 1 :(得分:0)

假设您正在为dwRead传递正确的值,我认为问题是该流尚未刷新。确保在块内创建binary_oarchive,这样当它超出范围时,它的析构函数会刷新流。

std::ofstream ofs("filename");
{
    boost:archive::binary_oarchive oa(ofs);
    oa << tc;
}

// Set up your pipe and assign a value to dwRead
// ...

::WriteFile(hPipe, &oa, dwRead, &dwWritten, NULL);