【向量的序列化及反序列化】std::string及std::vector<float>的交互

67 篇文章 1 订阅
44 篇文章 4 订阅
这篇博客介绍了两种在C++中实现序列化和反序列化的方法。第一种利用Qt库将浮点数向量转换为字符串并用逗号分隔,然后反向解析回浮点数向量。第二种方法使用了标准模板库(STL)的stringstream进行序列化和反序列化操作,适用于内置数据类型。这两种方法都确保了数据的正确序列化和反序列化。
摘要由CSDN通过智能技术生成

法1:转为字符串并用逗号分割,这里使用的是qt的库

//序列化
std::vector<float>m{-0.274489, 0.535285, -1.53439, -0.870895, 0.798769, -0.199406, -0.506447};
QString after="";
for(auto each:m)
{
    after=after+QString::number(each, 'g', 6)+",";
}
after.chop(1);
qDebug()<<after;
//反序列化
auto list=after.split(",");
std::vector<float>newone;
for(auto each:list)
{
    newone.push_back(each.toDouble());
    qDebug()<<each.toDouble();
}

法2:该法中,中间序列化得到的std::string,不要与qstring交互,不然会出错

std::stringstream oss;
std::vector<float>m{0.03,0.56,0.89,0.72,0.56,0.99};
serialize<float>(oss, m);
std::string a=oss.str();
//反序列化
std::stringstream newone;
newone<<a;
std::vector<float>newV;
deserialize<float>(newone,newV);
for(auto each:newV)
{
    qDebug()<<each<<" ";
}
qDebug()<<"modelBuild"<<time.elapsed()<<"ms";

辅助函数:

template<typename POD>
std::ostream& serialize(std::ostream& os, std::vector<POD> const& v)
{
    // this only works on built in data types (PODs)
    static_assert(std::is_trivial<POD>::value && std::is_standard_layout<POD>::value,
        "Can only serialize POD types with this function");

    auto size = v.size();
    os.write(reinterpret_cast<char const*>(&size), sizeof(size));
    os.write(reinterpret_cast<char const*>(v.data()), v.size() * sizeof(POD));
    return os;
}

template<typename POD>
std::istream& deserialize(std::istream& is, std::vector<POD>& v)
{
    static_assert(std::is_trivial<POD>::value && std::is_standard_layout<POD>::value,
        "Can only deserialize POD types with this function");

    decltype(v.size()) size;
    is.read(reinterpret_cast<char*>(&size), sizeof(size));
    v.resize(size);
    is.read(reinterpret_cast<char*>(v.data()), v.size() * sizeof(POD));
    return is;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颢师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值