Доступ к хранимым структурам, для которых у меня есть описание XML - PullRequest
1 голос
/ 30 ноября 2008

Я создал своего рода библиотеку C ++ с поддержкой интроспекции, которая позволяет, используя минимум макросов и изрядное количество хитрости шаблонов, объявлять структуры и классы, которые обогащаются некоторой метаинформацией.

Эта метаинформация собирает все важные детали о каждом поле структуры / класса, который вы объявляете, и в конце истории вы можете для каждого обогащенного таким образом структуры / класса создавать XML-файл, который дампы для каждого поля, его имя, тип, длина, смещение и т. д. и т. д.

Для моей проблемы мне не нужно поддерживать поля, которые являются указателями, а только примитивные типы, массивы и контейнеры STL (векторы, списки и т. Д.)

Код, который заполняет эти метаобогащенные структуры / классы («производитель»), в определенный момент сериализует их (на данный момент это простой двоичный дамп всех примитивных типов и всех «буферов», используемых STL). контейнеры, если есть).

Теперь мне нужно начать разработку аналога «читателя», который может во время выполнения , начиная с описания xml, созданного «производителем», для доступа к различным полям хранимых данных. .

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

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

Ответы [ 2 ]

1 голос
/ 02 декабря 2008

/ * Smarc делает это просто * /

  class xmlstream
  {
  ...
  };

  class ibase
  {
  void read( xmlstream& rStream ) = 0;
  void write( xmlstream& rStream ) = 0;
  };

  class classfactory
  {
  void produce( xmlstream& rStream );
  void consume( xmlstream& rStream );  
  ibase* create( xmlstream& rStream );
  void destroy( ibase* pBase );
  };

  class class1 : public ibase
  {
  static class1* create( );
  static void    destroy( class1* pObject );
  void read( xmlstream& rStream );
  void write( xmlstream& rStream );
  };

  class class2 : public ibase
  {
  static class1* create( );
  static void    destroy( class1* pObject );
  void read( xmlstream& rStream );
  void write( xmlstream& rStream );
  };

Позвольте мне, если это не ясно.

0 голосов
/ 10 апреля 2009

Вы смотрели на Boost Serialization ? Это в значительной степени делает то, что вы просите.

...