这不起作用:
template <class Archive, typename T>
inline void save(Archive& arch, const TAO::unbounded_basic_string_sequence<T>& varSequence, unsigned int version)
{
size_t length = varSequence.length();
arch & length & make_array(varSequence.get_buffer(), length);
}
template <class Archive, typename T>
void load(Archive& arch, TAO::unbounded_basic_string_sequence<T>& varSequence, unsigned int version)
{
size_t length;
arch & length;
varSequence.length(length);
arch & make_array(varSequence.get_buffer(), length);
}
template <class Archive, typename T>
inline void serialize(Archive& arch, TAO::unbounded_basic_string_sequence<T>& varSequence, const unsigned int version)
{
split_free(arch, varSequence, version);
}
编者说:
(..)/include/boost/serialization/access.hpp:118:9: error: request for member 'serialize' in 't', which is of non-class type 'char'
我知道boost :: serialization不支持C风格的字符串。从理论上讲,我可以使用std :: string作为save(),但我不知道如何从std :: string返回到TAO :: unbouded_basic_string_sequence - 这个类几乎没有文档。
答案 0 :(得分:2)
您的混淆似乎是您希望序列包含字符,而实际上它包含零终止字符串。
从查看实现代码(实际上文档不是很有用),似乎Unbounded Basic String Sequence使用String Traits来了解如何操作字符串。
T = char
的特征表明StringManager_T<T>
类用于“管理”字符串。因此,它是一个复杂的设置,其中序列将原始指针存储为“无主”的零终止字符串。
但是,通过特征暗示所有操作都是通过使用StringManager的string_sequence_element代理完成的,并且这模拟了以null结尾的字符串的值语义。例如。 assignment is done like
00055 {
00056 CORBA::string_free (this->ptr_);
00057 this->ptr_ = CORBA::string_dup (p);
00058 return *this;
00059 }
我无法测试这一切的正确操作,但这是您可以尝试的原始尝试:
namespace boost { namespace serialization {
template <typename Archive, typename T>
inline void save(Archive& ar, TAO::unbounded_basic_string_sequence<T> const& varSequence, unsigned int /*version*/)
{
ar & varSequence.length();
std::basic_string<T> scratch;
scratch.reserve(256);
for (size_t i = 0; i < varSequence.length(); ++i) {
scratch.assign(varSequence[i]); // assumes zero-terminated
ar & scratch;
}
}
template <typename Archive, typename T>
void load(Archive& ar, TAO::unbounded_basic_string_sequence<T>& varSequence, unsigned int /*version*/)
{
size_t length;
ar & length;
varSequence.length(length);
std::basic_string<T> scratch;
scratch.reserve(256); // some sane starting point?
for (size_t i = 0; i < varSequence.length(); ++i) {
ar & scratch;
varSequence[i] = scratch.c_str();
}
}
template <typename Archive, typename T>
inline void serialize(Archive& ar, TAO::unbounded_basic_string_sequence<T>& varSequence, const unsigned int version)
{
split_free(ar, varSequence, version);
}
template <typename Archive>
inline void serialize(Archive& ar, SequenceOfString& sos, unsigned int /*version*/) {
ar & base_object<TAO::unbounded_basic_string_sequence<char> >(sos);
}
答案 1 :(得分:0)
你正在采取一条你不应该接受我的想法的路线。当您使用IDL并基于它生成类型映射时,您应该使用由TAO生成的CORBA(de)序列化并使用IDL到C ++映射定义的类型,现在您正在使用所有类型的内部类。
目前您拥有IDL类型,您可以使用CodecFactory支持(de)将这些类型序列化为一系列字节,请参阅ACE_wrappers / TAO / tests / Codec作为示例代码。使用CodecFactory,您可以以适合任何CORBA供应商的便携方式执行此操作。