如何使用 boost::序列化序列化 TAO:<T>:unbouded_basic_string_sequence?

How to serialize TAO::unbouded_basic_string_sequence<T> using boost::serialization?

本文关键字:序列化 basic 何使用 string sequence unbouded gt boost lt TAO      更新时间:2023-10-16

这不起作用:

    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供应商一起使用。