簡體   English   中英

C ++ Cereal:序列化C風格的數組

[英]C++ Cereal: serialize C-style array

可以/如何使用谷物庫序列化數組。

void save(Archive & ar, const unsigned int version) const
{
    unsigned int l  = g1_size_bin(g,POINT_COMPRESS);
    uint8_t data[l];
    memset(data, 0, l);
    g1_write_bin(data, l, g,POINT_COMPRESS);
    ar(l);
    ar(data); // what should be here
}

這不起作用(我也不期望它)。 也沒有

ar(cereal::binary_data(data,l)); 

(我認為它會工作,因為它看起來像一個人會使用的增強代碼),這會產生編譯錯誤:

/usr/local/include/cereal/cereal.hpp:79:17:注意:候選模板被忽略:替換失敗:可變修改類型'unsigned char(&)[l]'不能用作模板參數BinaryData binary_data(T && data,size_t size)

也沒有

ar.saveBinaryValue(data,l);

由於該方法似乎只支持XML / Json,我想要一個二進制存檔。

cereal::binary_data是在這種情況下使用的正確構造,假設您需要POD數組的二進制表示。 這僅適用於支持binary_data (binary和portable_binary)的歸檔。 binary_data不適用於基於文本的歸檔,因為它被視為更通用的序列化方法的優化 - 請參閱如何序列化vector以獲取此示例。

無論如何,這是一個序列化C樣式數組的工作示例:

#include <cereal/archives/binary.hpp>
#include <iostream>

int main()
{
  std::stringstream ss;

  {
    cereal::BinaryOutputArchive ar(ss);
    std::uint8_t data[] = {1, 2, 3};
    ar( cereal::binary_data( data, sizeof(std::uint8_t) * 3 ) );
  }

  {
    cereal::BinaryInputArchive ar(ss);
    std::uint8_t data[3];
    ar( cereal::binary_data( data, sizeof(std::uint8_t) * 3 ) );

    for( int i : data )
      std::cout << i << " ";
  }

  return 0;
}

如果要將C樣式數組序列化為基於文本的存檔,或者如果您的數組不是POD類型,則需要迭代每個對象並單獨對其進行序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM