使用 boost::serialization 序列化 TAO/CORBA 个对象

Serializing TAO/CORBA objects with boost::serialization

我在序列化由 corba 生成的 类 时遇到问题 - 特别是对于任何类型的序列 - TAO::unbouded_value_sequence、TAO::unbouded_basic_string_sequence 等

是否有任何 "good" 序列化 CORBA 结构的解决方案,或者我是否对 corba 类的代码进行逆向工程并尝试为每个类编写序列化函数?

编辑:

      struct Something;

      typedef
        TAO_Var_Var_T<
            Something
          >
        Something_var;

      typedef
        TAO_Out_T<
            Something
          >
        Something_out;


      struct  Something
      {
        typedef Something_var _var_type;
        typedef Something_out _out_type;

        static void _tao_any_destructor (void *);
        TAO::String_Manager member1;
      };
    class SequenceOfSomething;

  typedef
    TAO_VarSeq_Var_T<
        SequenceOfSomething
      >
    SequenceOfSomething_var;

  typedef
    TAO_Seq_Out_T<
        SequenceOfSomething
      >
    SequenceOfSomething_out;

  class  SequenceOfSomething
    : public
        TAO::unbounded_value_sequence<
            Something
          >
  {
  public:
    SequenceOfSomething (void);
    SequenceOfSomething ( ::CORBA::ULong max);
    SequenceOfSomething (
        ::CORBA::ULong max,
        ::CORBA::ULong length,
        SequenceOfSomething* buffer, 
        ::CORBA::Boolean release = false
      );
    SequenceOfSomething (const SequenceOfSomething &);
    virtual ~SequenceOfSomething (void);

    static void _tao_any_destructor (void *);

    typedef SequenceOfSomething_var _var_type;
    typedef SequenceOfSomething_out _out_type;


  };

这是一些从 IDL 定义生成的示例代码。

我安装了 ACE+TAO 框架,然后摆弄了一些东西。¹

看起来从实际的 IDL 出发更容易。

解析 IDL 的代码包含在 SDK 中,因此也许您可以利用它来生成一些序列化代码。

旁注:为什么要对已完全实现 IIOP 序列化的内容进行 Boost 序列化?您可以考虑使用 ACE 序列化 Boost Serializing a binary buffer 吗?如果不是,为什么不呢?


¹实际编译代码:http://paste.ubuntu.com/12907686/

感谢@sehe,这似乎有效:

namespace boost { namespace serialization {

    template <typename Archive, typename T>
        inline void save(Archive& ar, const TAO::unbounded_value_sequence<T>& varSequence, unsigned int /*version*/)
        {
            size_t length = varSequence.length();
            ar & length
               & boost::serialization::make_array(varSequence.get_buffer(), varSequence.length());
        }

    template <typename Archive, typename T>
        void load(Archive& ar, TAO::unbounded_value_sequence<T>& varSequence, unsigned int /*version*/)
        {
            size_t length;
            ar & length;

            varSequence.length(length);
            ar & boost::serialization::make_array(varSequence.get_buffer(), varSequence.length());
        }

    template <typename Archive, typename T>
        inline void serialize(Archive& ar, TAO::unbounded_value_sequence<T>& varSequence, const unsigned int version)
        {
            split_free(ar, varSequence, version); 
        }

    template <class Archive>
        inline void serialize(Archive& ar, SequenceOfSomething& seq, unsigned int version)
        {
            ar & base_object<TAO::unbounded_value_sequence<Something>>(seq);
        }
} }