用Boost反序列化Armadillo colvec

时间:2017-06-30 20:00:46

标签: c++ boost deserialization armadillo

我正在尝试使用Boost序列化/反序列化Armadillo colvec对象。 colvec是具有几种不同大小的列向量,例如它可以有2行2d向量,3行用于3d向量,我也在代码中使用其他特定的向量大小。

我不知道如果在反序列化过程中colvec中的行数未知,如何处理boost中colvec类型的序列化。

例如,为了序列化,我可能包括以下内容: -

namespace boost
{
    namespace serialization
    {
        template<class Archive>
        void serialize(Archive& archive, colvec& vector, unsigned int)
        {
            for (int i=0; i<vector.size(); i++)
            {
                archive& vector[i];
            }
        }
    }
}

这将序列化具有任意行数的colvec。但是,当此代码在&#34;反序列化&#34;期间运行时vector将是size()== 0的colvec,例如所需的行数将是未知的。

我想知道处理这个问题的最佳方法是什么。

我的理解可能会弄错。我是Armadillo和Boost的新手。

1 个答案:

答案 0 :(得分:1)

我建议拆分加载/保存。对于数组,您还需要先存储大小,以便能够知道反序列化时必须读取的组件数。对于连续的内存布局,请使用优化的

window.onload = function countChecked() {
  var n = $("input.theme:checked").length;
  if (n == 1) {
    $('input.theme:checkbox:not(:checked)').prop('disabled', true);
  } else {
    $('input.theme:checkbox:not(:checked)').prop('disabled', false);
  }
}
$("input.theme:checkbox").click(countChecked);

$('.Go').click(function() {

  var i=1;
  $('input[type="checkbox"]:checked').each(function(){
  $('select#list'+i).val($(this).val());
  i++;
  });

});

this is the first html for checkbox

    <input class="theme" type="checkbox" name="theme" value="Present" id="Present" />
<label for="Present">Present</label>
<input class="theme" type="checkbox" name="theme" value="Absent" id="Absent" />
<label for="Absent">Absent</label>
<input class="theme" type="checkbox" name="theme" value="Leave" id="Leave" />
<label for="Leave">Leave</label>
<input class="theme" type="checkbox" name="theme" value="Holiday" id="Holiday" />
<label for="Holiday">Holiday</label>
  <br><br> <input type="button" class="Go" value="Go" />

功能。最后,如果要支持XML存档使用

    <select id='list1' name='att_status[]'>
      <option value='Present'>Present</option>
      <option value='Absent'>Absent</option>
      <option value='Holiday'>Holiday</option>
      <option value='Leave'>Leave</option>
    </select>

你可以看看

boost::serialization::make_array(T*,size)

看看Boost如何序列化std :: vector,代码很容易阅读。

我从来没有使用过Armadillo但是未优化的代码(我对内存布局没有任何线索等等)肯定会接近:

boost::serialization::make_nvp(char*, T)
// or the BOOST_SERIALIZATION_NVP macro