Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::serialization序列化TAO/CORBA对象_C++_C++11_Boost_Corba_Boost Serialization - Fatal编程技术网

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

C++ 使用boost::serialization序列化TAO/CORBA对象,c++,c++11,boost,corba,boost-serialization,C++,C++11,Boost,Corba,Boost Serialization,我在序列化corba生成的类时遇到了一个问题——特别是对于任何类型的序列——TAO::unbuded_value_序列、TAO::unbuded_basic_string_序列等等 对于CORBA结构的序列化有什么“好”的解决方案吗?或者我是否对CORBA分类的代码进行了反向工程,并尝试为每个分类编写序列化函数 编辑: struct某物; 类型定义 陶瓦< 某物 > 某物; 类型定义 道出< 某物 > 出了什么事; 构造某物 { typedef Something_var_var_type; 键

我在序列化corba生成的类时遇到了一个问题——特别是对于任何类型的序列——TAO::unbuded_value_序列、TAO::unbuded_basic_string_序列等等

对于CORBA结构的序列化有什么“好”的解决方案吗?或者我是否对CORBA分类的代码进行了反向工程,并尝试为每个分类编写序列化函数

编辑:

struct某物;
类型定义
陶瓦<
某物
>
某物;
类型定义
道出<
某物
>
出了什么事;
构造某物
{
typedef Something_var_var_type;
键入def Something_out _out_type;
静态void _tao_any_析构函数(void*);
TAO::字符串管理器成员1;
};
某事物的类别;
类型定义
TAO_VarSeq_Var_T<
某物的顺序
>
某事物的顺序;
类型定义
道奇<
某物的顺序
>
某些事情的顺序;
某事物的类别
:公众
TAO::无界值序列<
某物
>
{
公众:
某事物的顺序(无效);
某物的顺序(::CORBA::ULong max);
某物的顺序(
::CORBA::ULong max,
::CORBA::ULong长度,
某物的序列*缓冲区,
::CORBA::Boolean release=false
);
某事物的顺序(const sequenceof something&);
某事物的虚拟序列(void);
静态void _tao_any_析构函数(void*);
类型定义某些内容的顺序\u var\u var\u类型;
类型定义某些内容的顺序输出类型;
};

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

我安装了ACE+TAO框架,并处理了一些事情。ª

看起来从实际的IDL开始更容易

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

旁注:为什么Boost要序列化已经完全实现IIOP序列化的东西?您能考虑用ACE序列化提升Boost缓冲区吗?若否,原因为何



实际编译代码:

多亏了@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);
        }
} }
namespace boost{namespace序列化{
模板
内联void save(存档&ar,常量TAO::无界值序列&varSequence,unsigned int/*version*/)
{
size_t length=varSequence.length();
ar和长度
&boost::serialization::make_数组(varSequence.get_buffer(),varSequence.length());
}
模板
无效加载(归档和ar,TAO::无界值序列和变量序列,无符号int/*版本*/)
{
尺寸与长度;
ar&长度;
varSequence.length(长度);
ar&boost::serialization::make_数组(varSequence.get_buffer(),varSequence.length());
}
模板
内联void序列化(Archive&ar,TAO::unbounded_value_sequence&varSequence,const unsigned int version)
{
无拆分(ar、varSequence、版本);
}
模板
内联void序列化(归档和ar、SequenceOfSomething和seq、未签名int版本)
{
应收账款和基本对象(序号);
}
} }

最佳做法是为您的类型实现非侵入式序列化。问题是什么?(提示您可能需要显示一些代码)如果可以,我会共享一些代码;)当然,我是以非侵入式的方式来做这件事的——我只是想了解一些关于如何为这些“容器”实现serialize()的资源或建议。CORBA结构还包含一些在从IDL文件编译过程中添加的成员和typedef。通常是这样的:
typedefsometype\u var\u var\u type;typedef SomeType_out _out_type;静态void _tao _any _析构函数(void*)
我不知道如何处理这些事情。我以前没有使用CORBA的经验。那么你要的是文档/教程。那是离题的。我有几十个答案。我打赌其中有一半是如何序列化用户定义(模板)类型的示例。从那里开始?另外,也许只需发布一个IDL生成的示例头。如果你认为它是顶级的,那么重命名它是很简单的。我添加了一些示例代码。我也对这个问题感到困惑,当你使用IDL定义你的类型系统时,你使用的中间件产品(本例中为TAO)将为你生成(反)序列化代码,你自己不需要这样做。也许作者可以退一步,让我们知道他的目标,你想做什么?好的,但是如何转储和加载这些序列化结构呢?(我期望某种序列化,因为它必须通过网络发送)我期望这种序列化是某种二进制的,而不是人类可读的格式,在这种情况下,这是非常关键的,因为我必须转储一个结构,并能够在以后的测试中使用它,能够手动修改这些数据会很好。我无法立即在文档中找到这一点,但这就是我要查找的地方:)我已经为某些内容定义了serialize(),并定义了无界的\u value\u序列-我需要为SequenceOfSomething单独定义serialize吗?编译器告诉我,它没有看到任何序列化()的实现(说它没有成员调用serialize()),我无法从我所处的位置判断(我超出了心理读数的月配额…)。你当然可以让我看看你有什么。另见和。
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);
        }
} }