다음은 내가 생각해 낸 해결책입니다. 자체 스트림을 구현할 필요가 없으며 다음 번 serialization마다 동일한 메모리 덩어리를 다시 사용할 수 있습니다. 는 직렬화 구조체를 다음 한 것으로 추측 :
boost::iostreams::basic_array<char> sink; // target buffer
boost::iostreams::stream<boost::iostreams::basic_array<char> > os; // stream wrapper around it
boost::archive::binary_oarchive oa; // archive which uses this stream
그런 다음 같은 버퍼 그냥 스트림을 다시 재사용 :
os.close();
os.open(sink);
스트림 내에서 일부 내부 포인터를 변경하는 등 빠른이어야한다. 실제 속도는 테스트하지 않았습니다.
쓰기위한 코드 : Writer가 전달 된 포인터를 버퍼에 직렬화합니다. 리더
#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/serialization/export.hpp>
#include <boost/serialization/access.hpp>
class A;
class Writer {
char *buf;
int len;
boost::iostreams::basic_array<char> sink;
boost::iostreams::stream<boost::iostreams::basic_array<char> > os;
boost::archive::binary_oarchive oa;
public:
Writer(char *_buf, int _len): buf(_buf), len(_len), sink(buf, len), os(sink), oa(os) {}
void write(A* a) {
oa << a;
}
void reset() {
os.close();
os.open(sink);
}
};
class Reader {
char *buf;
int len;
boost::iostreams::basic_array_source<char> src;
boost::iostreams::stream<boost::iostreams::basic_array_source<char> > is;
boost::archive::binary_iarchive ia;
public:
Reader(char *_buf, int _len): buf(_buf), len(_len), src(buf, len), is(src), ia(is) {}
A* read() {
A* a;
ia >> a;
return a;
}
void reset() {
is.close();
is.open(src);
}
};
int main(int argc, char **argv) {
// to memory
char buffer[4096] = {0};
Writer w(buffer, sizeof(buffer));
A *a1 = new A(5);
w.write(a1);
Reader r(buffer, sizeof(buffer));
A *a2 (NULL);
a2 = r.read();
assert(*a1 == *a2);
std::cout << "Simple ok\n";
// test reuse
w.reset();
r.reset();
A *a3 (NULL);
w.write(new A(10));
a3 = r.read();
assert(*a3 == A(10));
std::cout << "Reuse ok\n";
};
class A
{
private:
friend class boost::serialization::access;
int i;
template <typename Archive>
void serialize(Archive& ar, const unsigned int version) {
std::cout << "serialize A\n";
ar & i;
}
public:
A(): i(0) {};
A(int _i): i(_i) {};
virtual bool operator==(const A&r) { return i == r.i; };
virtual ~A() {};
virtual void whoa() {std::cout << "I am A!\n";};
virtual const char* me() { return "A"; };
};
그런 다음 즉시이 '당신이 그 내용을 버릴려고하는 경우에, 모든 버퍼를 갖는 지점 무엇 (같은 버퍼가 독자와 작가 사이에 공유) 같은 버퍼 포인터를 역 직렬화 다시 썼나? –
정확히 루프에 무엇이 포함되어 있습니까? 'serial_str'을 선언하면 각 루프에서 생성되기 때문에 지울 필요가 없습니다. –
@Tomalak 죄송합니다. 각 객체를 직렬화 한 후에 boost :: interprocess :: message_queue를 사용하여 내용을 다른 프로세스로 보냅니다. –