2

を介してシリアル化例外を強化しました。これは私の問題です。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; 
} 
+0

ブーストユニットテストはどのように役立ちますか? – Damian

+0

すべてのドキュメンテーション、サンプル、およびテストを見て、私の問題にヒントはありません。私はブーストシリアライゼーションコードをもっと深く見てきました。「短いタグ」が処理されていないように見えますが、これはちょっと驚くべきことです。バグを提出するつもりです報告し、彼らが言うことを見る。 – DIGGIDY

答えて

0

ビットが遅くなりましたが、私はブーストから返信メールを受け取りました。

はいこれは多少のバグですが、修正するつもりはありません。ここで

返信たちの興味を持っている場合:

xml_archiveコード、すべてのシリアル化コードは、我々は我々が保存まさにロード ことを前提としないと。一般的にそれをより多くしようとしている 一般的なリスクの価値があるとは思われませんでした。作成する場合は、 タグを扱うスピリチュアルパーサーにパッチを提出してください。 私はそれを見るでしょう。しかし、これが欠けている、私は時間を費やすことに傾いていない これ。

関連する問題