повысить исключение сериализации, в и из XML, через SQL Server тип данных XML - PullRequest
2 голосов
/ 19 октября 2011

Хорошо, вот моя проблема.

У меня есть объект Boost, который создает XML-строку через сериализацию, это прекрасно работает.

Использование версии Boost 1.38

Я беруэту строку xml и сохраните ее в таблицу базы данных сервера sql в тип данных 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.

Я столкнулся с кирпичной стеной с этим и не знаю, как исправитьпроблема, и не могу найти реВ связи с этой проблемой в Интернете, поэтому любая помощь будет принята с благодарностью.

:)

Вот мой код, он должен компилироваться без каких-либо проблем, вам просто нужно заполнить пробелы длячасть БД:

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

main.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;
}

1 Ответ

0 голосов
/ 16 июля 2012

Немного поздно, но я получил ответное письмо от boost.

Да, это в некоторой степени ошибка, но они не собираются ее исправлять.

Вот ответ, если наш интерес:

Код xml_archive, как и весь код сериализации, предполагает, что мы загружаем именно то, что сохраняем. Вообще пытаюсь сделать это более Вообще никогда не казалось, что стоит рисковать. Если вы хотите создать, протестировать и отправить патч для анализатора духа, который будет обрабатывать теги Я бы посмотрел на это. Но без этого я не склонен тратить время на этом.

...