Чтение \ запись boost :: binary_oarchive to pipe - PullRequest
0 голосов
/ 26 декабря 2008

Я продолжаю строить два простых процесса, перебрасывающих объекты класса один в другой (см. Мой предыдущий пост) через простые (анонимные) каналы. Теперь я открыл для себя 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 ]

1 голос
/ 25 февраля 2009

Я думаю, что проблема здесь в том, что вы пытаетесь передать указатель на объект архива в функции 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, которая записывает непосредственно в ваш дескриптор файла.

0 голосов
/ 09 января 2009

Предполагая, что вы передаете правильное значение для dwRead, я думаю, проблема в том, что поток не был очищен. Убедитесь, что вы создали двоичный_архив внутри блока, поэтому, когда он выходит из области видимости, его деструктор сбрасывает поток.

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);
...