如何使用 boost::序列化序列化 TAO:<T>:unbouded_basic_string_sequence?
How to serialize TAO::unbouded_basic_string_sequence<T> using boost::serialization?
这不起作用:
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::序列化不支持C样式字符串。理论上,我可以使用std::string来保存(),但我不知道如何从std::字符串返回到TAO::unbouded_basic_string_sequence——这个类几乎没有文档。
您的困惑似乎是,您希望序列包含字符,而实际上它包含零终止的字符串。
从实现代码来看(实际上文档并没有太大帮助),Unbounded Basic String Sequence似乎使用String Traits来了解如何对字符串进行操作。
T = char
的特性表明StringManager_T<T>
类用于"管理"字符串。因此,这是一个复杂的设置,其中序列存储指向"无主"零终止字符串的原始指针。
然而,通过特性隐含的是,所有操作都是通过使用StringManager的string_sequence_element代理完成的,这模拟了以null结尾的字符串的值语义。例如,分配是像一样完成的
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);
}
你正在走一条你根本不应该走的路。当您使用IDL并基于它生成类型映射时,您应该使用TAO生成的CORBA(反)序列化,并使用IDL到C++映射定义的类型,现在您正在使用所有类型的内部类。
当您拥有IDL类型时,您可以使用CodecFactory支持将这些类型(反)序列化为字节序列,请参阅ACE_wrappers/TAO/tests/Codec以获取示例代码。使用CodecFactory,您可以以一种可移植的方式来实现这一点,这种方式可以与任何CORBA供应商一起使用。
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 序列化多晶型接口
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?