gpt4 book ai didi

c++ - 通过sql server xml数据类型 boost 序列化异常,进出xml

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:43 25 4
gpt4 key购买 nike

好的,这是我的问题。

我有一个 boost 对象,它通过序列化创建 xml 字符串,这工作得很好。

使用 boost 版本 1.38

我将那个 xml 字符串保存到一个 sql server 数据库表中,变成一个 xml 数据类型,这也可以正常工作。

然后我从数据库表中检索我的 xml 字符串,但格式与插入时略有不同,基本上空白值已被短标记,来自 <data></data><data/>

这是前后的 xml 示例。

之前

<grid class_id="0" tracking_level="0" version="0">
<name>test_table</name>
<columns class_id="1" tracking_level="0" version="0">
<count>2</count>
<item_version>0</item_version>
<item class_id="2" tracking_level="1" version="0" object_id="_0">
<label>AAAA</label>
<data>xxxx</data>
</item>
<item class_id_reference="2" object_id="_1">
<label>BBBB</label>
<data></data>
</item>
</columns>
</grid>

之后

<grid class_id="0" tracking_level="0" version="0">
<name>test_table</name>
<columns class_id="1" tracking_level="0" version="0">
<count>2</count>
<item_version>0</item_version>
<item class_id="2" tracking_level="1" version="0" object_id="_0">
<label>AAAA</label>
<data>xxxx</data>
</item>
<item class_id_reference="2" object_id="_1">
<label>BBBB</label>
<data /> <!-- NOW SHORT TAGGED -->
</item>
</columns>
</grid>

这也很好,完全可以接受,并不意外。

当我使用这个 xml 字符串并尝试将 xml 序列化回 boost 对象时,问题就来了,当它遇到 xml 字符串中的短标签时,它会抛出异常。

我遇到了这个问题,不知道如何解决这个问题,并且在网上找不到任何关于这个问题的引用资料,所以任何帮助将不胜感激。

:)

这是我的代码,它应该没有任何问题地编译,你只需要填写数据库部分的空白:

网格.hpp

////////////////////////////////////////////////////////////////
// grid boost serialization object
//
#pragma once

#include <string>
#include <iomanip>
#include <iostream>
#include <fstream>

#include <boost/serialization/nvp.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/version.hpp>

/////////////////////////////////////////////////////////////
// Column
//
namespace sdcm
{

class Column
{
public:
// every serializable class needs a constructor
Column()
{
}

Column(const std::string& _label, const std::string& _data)
: label(_label),
data(_data)
{
}

private:
friend class boost::serialization::access;
friend std::ostream & operator<<(std::ostream &os, const Column &col);

std::string label;
std::string data;

template<class Archive>
void serialize(Archive & ar, const unsigned int /* file_version */)
{
ar & BOOST_SERIALIZATION_NVP(label)
& BOOST_SERIALIZATION_NVP(data)
;
}
};

class Grid
{
public:
// every serializable class needs a constructor
Grid()
{
}

Grid(const std::string& _name)
: name(_name)
{
}

void append(Column* col)
{
columns.insert(columns.end(), col);
}

private:
friend class boost::serialization::access;
friend std::ostream & operator<<(std::ostream &os, const Grid &grid);

std::string name;

typedef Column* GRID_COLUMNS;
std::list<GRID_COLUMNS> columns;

template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(name)
& BOOST_SERIALIZATION_NVP(columns);
}
};

} // end namespace

主要.cpp

// boost_test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <sstream>
#include <iostream>
#include <string>

#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include "grid.hpp"

std::string get_grid_as_xml_str(sdcm::Grid& grid)
{
std::ostringstream xml ;
unsigned int flags = boost::archive::no_header
//| boost::archive::no_codecvt
//| boost::archive::no_xml_tag_checking
//| boost::archive::no_tracking
;

boost::archive::xml_oarchive oa(xml, flags);
oa << BOOST_SERIALIZATION_NVP(grid);
return xml.str();
}

void restore_grid_from_xml_str(sdcm::Grid& grid, const std::string& xml_str)
{
std::istringstream xml(xml_str);
unsigned int flags = boost::archive::no_header
//| boost::archive::no_codecvt
//| boost::archive::no_xml_tag_checking
//| boost::archive::no_tracking
;

boost::archive::xml_iarchive ia(xml, flags);
ia >> BOOST_SERIALIZATION_NVP(grid);
}

int _tmain(int argc, _TCHAR* argv[])
{
// create grid obj with cols
sdcm::Grid grid("MY GRID");
grid.append(new sdcm::Column("AAAA", "xxxx")) ;
grid.append(new sdcm::Column("BBBB", "")) ;

// get grid as xml string
std::string xml = get_grid_as_xml_str(grid) ;

// Assume xml is saved to SQL Server DB table in XML datatype,
// and the data has be retrived is a shorted tag format used
// where blank values are present in tags

// make a new grid
sdcm::Grid new_grid;
restore_grid_from_xml_str(new_grid, xml);

return 0;
}

最佳答案

有点晚了,但我确实收到了来自 boost 的回复邮件。

是的,这有点像错误,但他们不会修复它。

如果我们感兴趣,请在此处回复:

The xml_archive code, as does all the serialization code presumes that we load exactly what we save. Generally trying to make it more general never seemed worth the risk. If you want to create, test and submit a patch to the spirit parser which would handle the tags I would look at it. But lacking this, I'm not inclined to spend time on this.

关于c++ - 通过sql server xml数据类型 boost 序列化异常,进出xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7823875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com