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

3

我有一个问题,需要对由CORBA生成的类进行序列化 - 特别是任何类型的序列 - TAO :: unbouded_value_sequence,TAO :: unbouded_basic_string_sequence等。

是否有任何“好”的解决方案来序列化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定义生成的示例代码。

良好的实践是为您的类型实现非侵入式序列化。问题是什么?(提示 您可能想展示一些代码) - sehe
如果可以的话,我会分享一些代码;) 当然,我会以非侵入式的方式进行 - 我只是在寻求一些资源或建议,以了解如何为这些“容器”实现serialize()。CORBA结构还包含一些成员和typedefs,这些成员和typedefs是从IDL文件的编译过程中添加的。通常看起来像这样:typedef SomeType_var _var_type; typedef SomeType_out _out_type; static void _tao_any_destructor (void *)我不确定该怎么处理这些东西。 我没有CORBA的经验。 - Siekacz
你正在寻找文档/教程。这是不相关的主题。我在SO上有几十个关于[标签:boost-serialization]的答案。我打赌其中一半都是关于如何序列化用户定义(模板)类型的示例。从那里开始吧? - sehe
另外,如果可以的话,只需发布一个IDL生成的头文件样本即可。如果您认为这是绝密的,那么重命名它们是微不足道的。 - sehe
我添加了一些示例代码。 - Siekacz
2个回答

2
我安装了ACE+TAO框架,并进行了一些调整。看起来从实际的IDL开始更容易。
解析IDL的代码包含在SDK中,因此您可以利用它来生成一些序列化代码。
顺便说一下:为什么要使用Boost Serialize对已完全实现IIOP序列化的内容进行序列化?是否考虑过使用ACE序列化将二进制缓冲区进行Boost序列化?如果不行,为什么呢?
注:¹实际上是编译代码:http://paste.ubuntu.com/12907686/

我也对这个问题感到困惑。当你使用IDL来定义你的类型系统时,你所使用的中间件产品(在这种情况下是TAO)将为你生成(反)序列化代码,因此无需自己编写代码。也许作者可以退一步,让我们知道他的目标,他想要做什么? - Johnny Willemsen
我并没有立即在文档中找到这个,但那是我会去看的地方 :) - sehe
我已经为Something和unbounded_value_sequence<T>定义了serialize() - 我需要单独为SequenceOfSomething定义serialize()吗?编译器告诉我它没有看到Sequence of something的任何serialize()实现(说它没有称为serialize()的成员)。 - Siekacz
我无法从我的位置判断(我已经超过了心灵阅读的月度配额...)。当然,你可以展示给我你所拥有的。另请参阅**没有人再写测试用例了通过在Stackoverflow上几乎提问来解决您的问题**。 - sehe
一起来 https://www.livecoding.tv/sehe/ 吧?我们可以聊天、看看各种东西。 - sehe
显示剩余4条评论

0

多亏了 @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);
        }
} }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接