XML-сериализация C++ объектов - подскажите
От: Аноним  
Дата: 20.05.03 13:17
Оценка:
Пытаюсь написать простенькую библиотечку для сериализации объектов в XML. Предварительно изучил как сделана сериализация в MFC, XTL, ещё паре библиотек (в этом форуме также были весьма интересные обсуждения). И вот возник (простой, вроде бы) вопрос, который не знаю, как правильно разрешить.


Какова общая схема — есть некий класс (назовём его условно archive), в который "выкладываются" объекты:
  some_class ob;
  archive.put("xml_tag_for_object", ob);


Для простых типов archive::put() реализован непосредственно, для сложных типов вызывает определённую пользователем функцию, которая (что существенно!), не обязательно должна быть членом соответствующего класса, но и внешней функцией. Таким образом, легко реализуется сериализация, скажем, STL-контейнеров и т.п.

Проблема возникает, когда речь заходит о производных классах. Вспомним, как во всех библиотеках для обычной (не-xml)сериализации предлагается сериализовать объекты производных классов, при условии, что сериализация для базового уже есть (грубый псевдокод):
derived::serialize(archive& arc)
{
  // либо так (в более примитивных подходах, требующих, чтобы функция сериализации была членом)
  // нам это не подходит, далее речь только о втором случае
  base::serialize(arc);       
 
  // либо так (в более продвинутых, вот это и хотим повторить) 
  arc.put(static_cast<base&>(*this));  // либо аналог: arc << static_cast<base&>(*this);
}


Если пытаться непосредственно перенести это для xml, получим:
derived::serialize(archive& arc)
{
  arc.put("????" /* какой тэг сюда написать???*/,  static_cast<base&>(*this));
}

И мы получаем тот эффект, что подобъекты базовых классов неизбежно будут вложены в лишню пару тегов, типа вот такого:
<tag_for_the_derived>
  <nasty_tag1>
     base1 members
  </nasty_tag1>
  <nasty_tag2>
     base2 members
  </nasty_tag2>
  derived members
<tag_for_the_derived>


Т.е., в XML-фрагменте для объекта вместо "плоского" набора членов будет повторена иерархическая структура объекта. И я вот никак не могу понять — правильно ли это (имхо — скорее, неправильно). А если неправильно, то как с этим бороться — совсем непонятно. Какой же тогда интерфейс должен у archive быть?

Описал проблему плохо, но лучше не получается. Очень было бы интересно также выслушать, какие вообще есть идеи на тему xml-сериализации, а то у меня ещё много вопросов есть, которые пока толком сформулировать даже не могу.

Спасибо.
Re: XML-сериализация C++ объектов - подскажите
От: MaximE Великобритания  
Дата: 20.05.03 13:33
Оценка: 2 (1)
Здравствуйте, <Аноним>, Вы писали:

А>
А>derived::serialize(archive& arc)
А>{
А>  // либо так (в более примитивных подходах, требующих, чтобы функция сериализации была членом)
А>  // нам это не подходит, далее речь только о втором случае
А>  base::serialize(arc);       
А> 
А>  // либо так (в более продвинутых, вот это и хотим повторить) 
А>  arc.put(static_cast<base&>(*this));  // либо аналог: arc << static_cast<base&>(*this);
А>}
А>


А>Если пытаться непосредственно перенести это для xml, получим:

А>
А>derived::serialize(archive& arc)
А>{
А>  arc.put("????" /* какой тэг сюда написать???*/,  static_cast<base&>(*this));
А>}
А>

А>И мы получаем тот эффект, что подобъекты базовых классов неизбежно будут вложены в лишню пару тегов, типа вот такого:
А>
А><tag_for_the_derived>
А>  <nasty_tag1>
А>     base1 members
А>  </nasty_tag1>
А>  <nasty_tag2>
А>     base2 members
А>  </nasty_tag2>
А>  derived members
А><tag_for_the_derived>
А>


А>Т.е., в XML-фрагменте для объекта вместо "плоского" набора членов будет повторена иерархическая структура объекта. И я вот никак не могу понять — правильно ли это (имхо — скорее, неправильно). А если неправильно, то как с этим бороться — совсем непонятно. Какой же тогда интерфейс должен у archive быть?


Template Method Pattern тебе не поможет?:

class Base
{
public:
    void Serialize(Archive& a)
    {
        a.OpenTag(MyNameIs());
        DoSerialize(a);
        a.CloseTag(MyNameIs());
    }

protected:
    // определяем реализацию в наследниках
    virtual string MyNameIs() const = 0;
    virtual void DoSerialize(Archive& a) = 0;
};
Re: XML-сериализация C++ объектов - подскажите
От: Юнусов Булат Россия  
Дата: 20.05.03 13:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>derived::serialize(archive& arc)
А>{
А>  arc.put("????" /* какой тэг сюда написать???*/,  static_cast<base&>(*this));
А>}
А>


А вообще никакой тег не писать? завести в Archive функцию без тега только с референсом на обьект типа
    Archive::put(const ISerializable & ob)

и пускай обьект сам теги пишет
Re[2]: XML-сериализация C++ объектов - подскажите
От: Аноним  
Дата: 20.05.03 13:59
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>и пускай обьект сам теги пишет


Я думал об этом, но это (опять-таки, имхо ), неправильно. Почему? Сформулирую две предпосылки:

1) Для простых типов тэг так или иначе указывать нужно. Ведь хочется, чтобы полученный xml-файл был как можно более человеко-читабелен, поэтому
<age>30</age>
<salary>666.66</salary>

гораздо предпочтительнее, чем
<int>30</int>
<double>666.66</doble>

(ну, или какие мы ещё там захардкодим тэги для встроенных типов). Кстати, требование читабельности порождает ещё много противоречивых моментов, заставляющих уменьшать возможную общность решений.

2) Хочется иметь единый интерфейс для сериализации простых и "сложных" типов. Если от этого оказаться, невозможно будет как-то разумно сериализовать, например, STL-контейнеры, содержащие что угодно — сейчас же это достаётся фактически бесплатно.

Из 1),2) следует, что всё же _именовать_ объект должен за него кто-то другой, снаружи.
Да это мне и с точки зрения философии кажется более правильным
Re[3]: XML-сериализация C++ объектов - подскажите
От: Юнусов Булат Россия  
Дата: 20.05.03 18:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Юнусов Булат, Вы писали:


ЮБ>>и пускай обьект сам теги пишет


А>Я думал об этом, но это (опять-таки, имхо ), неправильно. Почему? Сформулирую две предпосылки:


А>1) Для простых типов тэг так или иначе указывать нужно. Ведь хочется, чтобы полученный xml-файл был как можно более человеко-читабелен, поэтому

А>
<age>>30</age>
А><salary>666.66</salary>
А>

А>гораздо предпочтительнее, чем
А>
<int>>30</int>
А><double>666.66</doble>
А>

А>(ну, или какие мы ещё там захардкодим тэги для встроенных типов). Кстати, требование читабельности порождает ещё много противоречивых моментов, заставляющих уменьшать возможную общность решений.

А>2) Хочется иметь единый интерфейс для сериализации простых и "сложных" типов. Если от этого оказаться, невозможно будет как-то разумно сериализовать, например, STL-контейнеры, содержащие что угодно — сейчас же это достаётся фактически бесплатно.


А>Из 1),2) следует, что всё же _именовать_ объект должен за него кто-то другой, снаружи.

А>Да это мне и с точки зрения философии кажется более правильным


Ты немножко не так понял, возможно, потому что я недостаточно ясно выразился.
Имелось в виду следующее (у всякого прогаммера есть свой вариант серилизации (не факт что лучший, но есть) — я не исключение)
Вот кусочек
    Archive & Archive::Write(const ISerializable & ob)
    {
        if (!read_) {
            Write(ob.GetClassId());
            ob.Write(*this);
        }
        else {
            throw(std::runtime_error("Stream is not open for writing"));
        }
        return *this;
    }


    Archive & Archive::Read(ISerializable & ob)
    {
        if (read_) {
            int id = -1;
            Read(id);
            std::auto_ptr < ISerializable > ptr( SerializableFactory::Instance().CreateObject(id) ); 
            if (0 != ptr.get() ) {
                ob = * ptr.release();
                ob.Read(*this);
            }
            else {
                throw(std::runtime_error("CreateObject() return 0"));
            }
        }
        else {
            throw(std::runtime_error("Stream is not open for reading"));
        }
        return *this;
    }


Все детали стандартные
// typedef Loki::SingletonHolder < Loki::Factory < ISerializable, int, Loki::Functor < ISerializable * > > > SerializableFactory;

Так что теги пишет обьект (класс или структура) который знает какие поля в нем находятся.
Re[4]: XML-сериализация C++ объектов - подскажите
От: Юнусов Булат Россия  
Дата: 20.05.03 18:14
Оценка:
PS
У меня не хмль серилизация, за основу взято это ftp://ftp.gnu.org/gnu/commonc++/index.html
Правда напильником обработано — прикручен локи с бустом туда, где мне казалось нужно было.
Re: XML-сериализация C++ объектов - подскажите
От: Юнусов Булат Россия  
Дата: 20.05.03 19:04
Оценка: 10 (2)
Здравствуйте, Аноним, Вы писали:

Хмль серилизация для тех, кому проект сдавать надо вчера, иерархия классов уже имеется, а писать свою библиотеку хмль серилизации времени нету.
(Ахтнуг! ошибки и ексепшенсы не проверяются!)

typedef  Ado::Recordset20Ptr Archive;

class User
{
public:
    _bstr_t name_;
    long age_;
    User(void);
    ~User(void);
    Archive & Read(Archive & ar);
    Archive & Write(Archive & ar) const;
};



Archive & User::Read(Archive & ar)
{
    _variant_t v = rs->Fields->Item[0L]->Value;
    name_ = VT_NULL != v.vt ? _bstr_t(v) : _bstr_t("oops!");
    v = rs->Fields->Item[1L]->Value;
    age_ = VT_NULL != v.vt ? (long)v : -1L;

    return ar;
}



Archive & User::Write(Archive & ar) const
{
    rs->AddNew();
    rs->Fields->Item[0L]->Value = name_;
    rs->Fields->Item[1L]->Value = age_;
    rs->Update();
}




сохранение
    Archive rs_;
    rs_.CreateInstance(__uuidof(Ado::Recordset));
    rs_->CursorLocation = Ado::adUseClient;
    rs_->Fields->Append(_bstr_t(L"Имя"), Ado::adBSTR, 0, Ado::adFldUpdatable);  
    rs_->Fields->Append(_bstr_t(L"Возраст"), Ado::adUnsignedBigInt, 0, Ado::adFldUpdatable);
    rs_->Open(vtMissing, vtMissing, Ado::adOpenStatic, Ado::adLockOptimistic, Ado::adCmdUnspecified);

    struct _finddata_t fd = { 0 };
    long hFile = 0;
    if( -1L != (hFile = _findfirst(xmlFile, &fd)) )
        ::DeleteFile(xmlFile);

// от форыча 6-я студия ругается, но по всему тут нужен форыч
    for(std::vector< boost::shared_ptr<User> >::const_iterator it = users_.begin(); it != users_.end(); ++it) {
        (*it)->Write(rs_);
    }

    rs_->_xSave(xmlFile, Ado::adPersistXML);


Загрузка
    struct _finddata_t fd = { 0 };
    long hFile = 0;
    if( -1L == (hFile = _findfirst(xmlFile, &fd)) )    {
        throw std::runtime_error(_T("Враги стерли файл с юзверями!"));
    }

    rs_->Open(xmlFile, _bstr_t(L"Provider=MSPersist;"), Ado::adOpenForwardOnly, Ado::adLockReadOnly, Ado::adCmdFile);
    if (!rs_->adoEOF) {
        rs_->MoveFirst();
        while(!rs_->adoEOF) {
            boost::shared_ptr<User> user(new User());
            user->Read(rs_);
            users_.push_back(user);
        }
    }
Re[4]: XML-сериализация C++ объектов - подскажите
От: Аноним  
Дата: 20.05.03 23:49
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Так что теги пишет обьект (класс или структура) который знает какие поля в нем находятся.


Теги для членов — да. А вот тег для себя — нет, отсюда и проблема с предками.

Да, и ещё, может, я чего-то не понимаю, но этот код мне кажется подозрительным:

ЮБ> Archive & Archive::Read(ISerializable & ob)

ЮБ> {
ЮБ> if (read_) {
ЮБ> int id = -1;
ЮБ> Read(id);
ЮБ> std::auto_ptr < ISerializable > ptr( SerializableFactory::Instance().CreateObject(id) );
ЮБ> if (0 != ptr.get() ) {
ЮБ> ob = * ptr.release();
ЮБ> ob.Read(*this);
ЮБ> }
ЮБ> else {
ЮБ> throw(std::runtime_error("CreateObject() return 0"));
ЮБ> }
ЮБ> }
ЮБ> else {
ЮБ> throw(std::runtime_error("Stream is not open for reading"));
ЮБ> }
ЮБ> return *this;
ЮБ> }

Я так понимаю, что CreateObject() создаёт объект в динамически распределяемой памяти, затем указатель на него утрачивается, и в переданный снаружи объект происходит считывание.
Re: XML-сериализация C++ объектов - подскажите
От: lboss Россия  
Дата: 21.05.03 02:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И мы получаем тот эффект, что подобъекты базовых классов неизбежно будут вложены в лишню пару тегов, типа вот такого:

А>
А><tag_for_the_derived>
А>  <nasty_tag1>
А>     base1 members
А>  </nasty_tag1>
А>  <nasty_tag2>
А>     base2 members
А>  </nasty_tag2>
А>  derived members
А><tag_for_the_derived>
А>


А>Т.е., в XML-фрагменте для объекта вместо "плоского" набора членов будет повторена иерархическая структура объекта. И я вот никак не могу понять — правильно ли это (имхо — скорее, неправильно). А если неправильно, то как с этим бороться — совсем непонятно. Какой же тогда интерфейс должен у archive быть?


Ну я считаю проблемму надуманной, хотя решение простое — заведи в архиваторе спец функцию/подкласс для записи тега класс — и просто отсекай вложенные вызовы...

Пример с функцией:
derived::serialize(archive& arc)
{
//<Vadim>
  arc.begin("derived_tag");
//</Vadim>

  // либо так (в более примитивных подходах, требующих, чтобы функция сериализации была членом)
  // нам это не подходит, далее речь только о втором случае
  base::serialize(arc);       
 
  // либо так (в более продвинутых, вот это и хотим повторить) 
  arc.put(static_cast<base&>(*this));  // либо аналог: arc << static_cast<base&>(*this);

//<Vadim>
  //Сохранение мемберов derived
  ...
  arc.end("derived_tag");//Вообще-то эта строчка излишняя...
//</Vadim>

}


Пример с вложенным классом:
derived::serialize(archive& arc)
{
//<Vadim>
  archive::beginClass cl(arc."derived_tag");
//</Vadim>

  // либо так (в более примитивных подходах, требующих, чтобы функция сериализации была членом)
  // нам это не подходит, далее речь только о втором случае
  base::serialize(arc);       
 
  // либо так (в более продвинутых, вот это и хотим повторить) 
  arc.put(static_cast<base&>(*this));  // либо аналог: arc << static_cast<base&>(*this);

//<Vadim>
  //Сохранение мемберов derived
  ...
//</Vadim>
}


Можно ещё поизвращатся, но это всё дело техники...
С уважением Вадим.
Re: XML-сериализация C++ объектов - подскажите
От: m.a.g. Мальта http://dottedmag.net/
Дата: 21.05.03 02:57
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>И мы получаем тот эффект, что подобъекты базовых классов неизбежно будут вложены в лишню пару тегов, типа вот такого:

А>
А><tag_for_the_derived>
А>  <nasty_tag1>
А>     base1 members
А>  </nasty_tag1>
А>  <nasty_tag2>
А>     base2 members
А>  </nasty_tag2>
А>  derived members
А><tag_for_the_derived>
А>


Можно вспомнить, что в OMG стандартизовали сериализацию UML в XML ровно таким же образом. Так стоит ли мучаться?
... << RSDN@Home 1.0 beta 7a 1.0.1227.39074>>
Re: XML-сериализация C++ объектов - подскажите
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 21.05.03 06:33
Оценка:
Я сделал в своем проекте суперхак для реализации XML сериализации.
Там немного другие цели были но может вам будет интересно.


    Основная цель написания парсера была перевести работу с данными
    получеными их XML из Runtime в фазу компиляции. Т.е. достаточно
    много есть всяких решений которые делают вот так

    XML["FOO"]["BAR"]["BAZ"]=5;
    или
    XML.setParam("foo",6).setParam("bar",7);

    Но данные решения обнаруживают ощибки в Runtime т.е.
    если такого параметра в XML нет то обнаружено это не будет.

    Цель моего решения было заставить компилятор проверять
    параметры на правильность в Compile Time.

    (Вообще всегда в любом случае XML нужно парсить по получении 
    и дальше работать со структурами. Т.к. если он не распарсился то
    достаточно легко отстрелить клиента с сообщением об ошибке, 
    а если нераспарсеный кусок тащать дальше то ошибка может возникнуть
    в середине программы когда не понятно что с ней делать)

    Т.е. идеальный вариант это описание структуры

    class
    {
      int b;
      class {
        int a;
        string s;
      } subNode;
    } XML;

    Которая потом автосериализуется в XML и обратно, тогда
    обращения к ней делаются как

    XML.subNode.a=10;
    XML.subNode.s="foo";
    XML.b.55;

    В этом случае мы поимеем абсолютный хэпинес по поводу того что
    компилятор за нас контролирует наличие переменных и правильную
    их типизацию.

    Единственно что хотелось бы чтобы компилятор сам магическим
    образом генерил процедуру сериализации и десериализации,
    т.к. написание всего этого руками это очень тупая и чреватая
    ошибками работа.

    Мне вообщем-то удалось эту проблему решить.
    описание структуры выглядит следующим образом

class Test: public XMLNode
{
public:
        Test() { fixup(); }
public:

        XML_VALUE(int,integer);
        XML_VALUE(QString,string);

        XML_NODE_BEGIN(Foobar)
                XML_VALUE(int,integer);
                XML_VALUE(QString,string);

                        XML_NODE_BEGIN(BarBazBarf)
                                XML_VALUE(int,integer);
                                XML_VALUE(int,another_integer);
                                XML_VALUE(QString,string);
                        XML_NODE_END(BarBazBarf);

                        XML_NODES_BEGIN(BarBazBarfMany)
                                XML_VALUE(int,integer);
                                XML_VALUE(int,another_integer);
                                XML_VALUE(QString,string);

                                XML_NODE_BEGIN(Foobar)
                                        XML_VALUE(int,integer);
                                        XML_VALUE(QString,string);
                                XML_NODE_END(Foobar);
                        XML_NODES_END(BarBazBarfMany);

        XML_NODE_END(Foobar);
};

В XML ей соответсвует следующая структура

<Test string="Test" integer="10" >
 <Foobar string="Test" integer="10" >
  <BarBazBarfMany another_integer="0" string="test string 1" integer="0" >
   <Foobar string="test string 2" integer="0" />
  </BarBazBarfMany>
  <BarBazBarfMany another_integer="0" string="test string 3" integer="0" >
   <Foobar string="test string 4" integer="0" />
  </BarBazBarfMany>
  <BarBazBarf another_integer="2009145416" string="Oanoiaua aaiiua" integer="1245104" />
 </Foobar>
</Test>

Обращение идет как положено

test.string="Test";
test.Foobar.string="Test2"

и тп.

Cейчас кратко опишу 2 основных жестких хака которые сделали это возможным.

Хак #1. Определение содержимого класса.

Класс Test должен как то получить в Runtime список всех своих
member-ов и указатели на них.

Делается это с использованием определенности порядка создания
элементов. Сначала вызывается конструктор базового класса,
потом конструктор всех Memebeк-ов, потом конструктор самого класса.

Дак вот где то в программе есть статическая переменная "стек"
Базовый класс запоминает сколько элементов лежит в стеке,
потом каждый Member в своем конструкторе кладет указатель
"this" на этот стек. После чего конструкторо самого класса
вызывает спец процедуру "fixup" и выгребает из стека все
указатели на своих member-ов.

Хак #2. Получение собственного имени в Runtime.
Задача, переменная в программе называется "B",
в момент компиляции это имя теряется, но нужно его получить
в Runtime чтобы знать с каким именем себя сериализовать.
Сделать это параметром шаблона нельзя

XMLValue<int, "name"> name;

т.к. параметры типа const char* не разрешены в шаблонах,
только int.

Решается это легко т.к. шаблоны разрешено
параметризовать классами

class xml_hack_name 
{
   QString name() { return "name" }
};
XMLValue<int, xml_hack_name> name;

Для того чтобы все 2 раза не писать я еще сделал макрос

#define XML_VALUE(type,name) \
        class xml_hack_##name 
        {
              QString name() { return #name }
        }; \
        XMLValue<type,xml_hack_##name> name;

И теперь все записывается вот так
        XML_VALUE(int,integer);


Если кому надо пришлю исходники, в качестве XML парсера используется парсер из QT
но кому надо тот переделает.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
решение на подходе
От: MaximE Великобритания  
Дата: 21.05.03 17:24
Оценка:
Сериализация скоро будет в boost'e:

[boost] Re:What is the status of the Boost Serialization Library?

I am the author of the serialization library reviewed by boost last november.
This library is available in the files section under the name serialization6.zip(I think)
Though it fullfilled all the goals I originally set for such a library it
was not accepted into boost for a number of reasons.

Since then I have continued work to address the reasons for its
rejection. A few interested parties have also offered to help. Things
have proceeded as follows

a) better factoring of the implementation (done)
b) addition of all desired facitlities(done)

c) final improvements in new implementation ( almost done)
d) decompostion of tests into tests of finer granularity(pending)
e) new tests for new features(pending)
f) rework of documentation to account for new features (pending)
g) check out on multiple compilers.(pending)

I would hope that I can get this done in the next 60-90 days. Fortunately
I amd currently unemployed.

I do not know if anyone else is currently working on anything like this.

There are several options if you're in a hurry. Each has a different
set of features and different interface. The documentation in serialization6.zip
lists the other packages that I happened to know about. The documentation
is a year old and at least one package (Eternity) has evolved since I mentioned
it in the documentation. I know for a fact that some users have been using
serialization6.zip library with satisfactory results. Unfortunately, the archives
created wth this version most likely won't be readable with the next version
I submit. This may be a factor.

Robert Ramey

>Yao Zhen wrote:
>I am very intrested in the Boost Serialization Library, and have read in
>gmane.comp.lib.boost.announce that this library has been reviewed.

>I am wondering what is the review result and current status of the library.

Re: решение на подходе
От: Аноним  
Дата: 21.05.03 20:45
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Сериализация скоро будет в boost'e:


ME>I would hope that I can get this done in the next 60-90 days. Fortunately

ME>I amd currently unemployed.

На то, что сейчас уже есть (не оригинальный serialization6, а текущее состояние новой версии) где-нибудь посмотреть можно? Очень интересно, что именно и как сделано, и есть ли смысл дожидаться.
Re[2]: решение на подходе
От: MaximE Великобритания  
Дата: 22.05.03 05:12
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, MaximE, Вы писали:


ME>>Сериализация скоро будет в boost'e:


ME>>I would hope that I can get this done in the next 60-90 days. Fortunately

ME>>I amd currently unemployed.

А>На то, что сейчас уже есть (не оригинальный serialization6, а текущее состояние новой версии) где-нибудь посмотреть можно? Очень интересно, что именно и как сделано, и есть ли смысл дожидаться.


http://groups.yahoo.com/group/boost/files/
Re[3]: решение на подходе
От: Аноним  
Дата: 22.05.03 09:49
Оценка:
Здравствуйте, MaximE, Вы писали:

А>>На то, что сейчас уже есть (не оригинальный serialization6, а текущее состояние новой версии) где-нибудь посмотреть можно? Очень интересно, что именно и как сделано, и есть ли смысл дожидаться.


ME>http://groups.yahoo.com/group/boost/files/


Так был я там. Там только serialization6.zip годичной давности лежит. А новой разработки не видать.
Re[4]: решение на подходе
От: MaximE Великобритания  
Дата: 22.05.03 10:43
Оценка:
Здравствуйте, <Аноним>, Вы писали:

ME>>http://groups.yahoo.com/group/boost/files/


А>Так был я там. Там только serialization6.zip годичной давности лежит. А новой разработки не видать.


Может, надо посмотреть в boost sandbox? Я сам еще не смотрел.
Re[2]: XML-сериализация C++ объектов - подскажите
От: Аноним  
Дата: 14.02.04 21:46
Оценка:
Здравствуйте, Anatolix, Вы писали:

A>Если кому надо пришлю исходники, в качестве XML парсера используется парсер из QT

A>но кому надо тот переделает.

Скинь исходники, плиз, на martynov(at)sinn(dot)ru
Заранее спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.