這是我想出的解決方案。 它不需要實現您自己的流,並允許爲每個下一個序列化重用相同的內存塊。 假設你有以下安排了系列化結構:
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"; };
};
那是什麼,儘快爲他們」是具有所有的緩衝區,如果你打算扔掉其內容的點(相同緩衝區讀寫器之間共享)重寫? – 2011-06-13 11:42:41
循環中究竟包含什麼?如果你聲明'serial_str',你也不必清除它,因爲它是在每個循環中創建的。 – 2011-06-13 11:48:57
@Tomalak對不起,我應該提到序列化每個對象後,我使用boost :: interprocess :: message_queue將其內容發送到另一個進程。 – 2011-06-13 11:54:43