使用 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 吗?如果不是,为什么不呢?
感谢@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);
}
} }
我在序列化由 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 吗?如果不是,为什么不呢?
感谢@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);
}
} }