を介してシリアル化例外を強化しました。これは私の問題です。xmlとの間で、SQL Server xmlデータ型
私はシリアル化によってXML文字列を作成するboostオブジェクトを持っていますが、これはうまく動作します。ブーストバージョン1.38
を使用して
私はこれも正常に動作し、そのXML文字列を取得し、XMLデータ型へのSQL Serverデータベースのテーブルに保存します。
私は、データベース・テーブルからの私の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 /> <!-- NOW SHORT TAGGED -->
</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></data>
</item>
</columns>
</grid>
前
また、これは、罰金と完全に受け入れかつ予想外ではありません。
この問題は、このXML文字列を取得し、XML文字列の短いタグ付きタグを渡すと例外をスローし、例外をスローします。
私はこれでレンガの壁に当たったが、問題の修正方法がわからず、ウェブ上でこの問題の参照を見つけることができないので、どんな助けでも大いに感謝するだろう。
grid.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;
}
ブーストユニットテストはどのように役立ちますか? – Damian
すべてのドキュメンテーション、サンプル、およびテストを見て、私の問題にヒントはありません。私はブーストシリアライゼーションコードをもっと深く見てきました。「短いタグ」が処理されていないように見えますが、これはちょっと驚くべきことです。バグを提出するつもりです報告し、彼らが言うことを見る。 – DIGGIDY