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

时间:2015-10-29 14:42:06

标签: c++ c++11 boost corba 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 :: serialization不支持C风格的字符串。从理论上讲,我可以使用std :: string作为save(),但我不知道如何从std :: string返回到TAO :: unbouded_basic_string_sequence - 这个类几乎没有文档。

2 个答案:

答案 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供应商的便携方式执行此操作。