Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.05 12:27
Оценка: 13 (2)
Вот такой синтаксис
template <typename _type>
SERIALIZABLE(class test)
    {
        SERIALIZABLE(int var1);
        SERIALIZABLE(_type var2);
        float var3;
    };

При условии, что сериализация int и _type уже где-то опеределена шаблонный класс test так же становиться сериализуемым. var3 не записывается и после чтения имеет неопределённое значение.

Скорее всего будет поддержка опциональных методов
void serialize_read_before(void)
void serialize_read_after(void)
void serialize_write_before(void)
void serialize_write_after(void)

Никаких дополнительных телодвижений, кроме того, что показано выше для придания классу test сериализуемости не требуется. Физический размер класса (прямо или косвенно, через структуры связанные с объектом класса) не увеличивается. Вот такой вот проект.

Что скажете? Насколько это на ваш взгляд будет удобно/востребованно?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Проект сериализации [просьба высказаться]
От: Dr.Gigabit  
Дата: 02.01.05 12:55
Оценка: +1
Здравствуйте, adontz, Вы писали:

[skiped]
A>Что скажете? Насколько это на ваш взгляд будет удобно/востребованно?

Имхо, в общем случае решить такую проблему и одновременно придумать что-то кардинально новое, по сравнению с
boost:serialization будет очень сложно.
... << RSDN@Home 1.1.4 @@subversion >>
Re: Проект сериализации [просьба высказаться]
От: yxiie Украина www.enkord.com
Дата: 02.01.05 13:34
Оценка: -1
Здравствуйте, adontz, Вы писали:

...

мне тоже интересно чем это будет лучше boost::serialization.
хотя касательно меня эта тема очень кстати, т.к. я до сих пор не сделал нормальную сериализацию и сейчас мучаюсь. поэтому рассматриваю разные варианты. пока остановился на буст, но развитие этой темы интересно.

короче говоря: в чем прикол? на первый взгляд интересно, расскажи по-больше / внимательно слушает/
... << RSDN@Home 1.1.3 stable >>
Re[2]: Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.05 13:58
Оценка:
Здравствуйте, Dr.Gigabit, Вы писали:

DG>Имхо, в общем случае решить такую проблему и одновременно придумать что-то кардинально новое, по сравнению с

DG>boost:serialization будет очень сложно.

У меня принципиально другой подход к решению задачи, использующий не только компилятор.

Что касаеться Our goals for such a system are:
  1. Code portability — depend only on ANSI C++ facilities.
    Я не буду этого специально добиваться, но использование MS Specific возможностей мне ИМХО не понадобиться. В любом случае MSVC будет для меня приоритетным компилятором и именно на нём всё будет разрабатываться.

  2. Code economy — exploit features of C++ such as RTTI, templates, and multiple inheritance, etc. where appropriate to make code shorter and simpler to use.
    Да.

  3. Independent versioning for each class definition. That is, when a class definition changed, older files can still be imported to the new version of the class.
    Тут мне не ясно, что значит changes. Если речь о том, что был класс (для удобства я обозначаю класс X_v1 и X_v2, но на самом деле у класса должно быть одно и тоже имя (tagname))
    SERIALIZABLE(class X_v1)
     {
      SERIALIZABLE(int x);
      SERIALIZABLE(int y);
     }

    а стал
    SERIALIZABLE(class X_v2)
     {
      SERIALIZABLE(int x);
      SERIALIZABLE(float z);
      SERIALIZABLE(int y);
     }

    и надо читать в X_v2 запись X_v1 то это будет реализовано. При этом надо заметить, что значение z будет не определено, но его можно установить реализовав метод serialize_read_before в котором z будет присваиваться некоторое осмысленное значение. Можно присваивать z это осмысленное значение и в конструкторе, если экземпляр класса не используется перед сериализацией
    Тут есть и другой момент. В данном случае
    SERIALIZABLE(class X_v1)
     {
      SERIALIZABLE(int x);
     }

    а стал
    SERIALIZABLE(class X_v2)
     {
      SERIALIZABLE(int y);
     }

    Значение y будет не определено, а значение x потеряется

  4. Deep pointer save and restore. That is, save and restore of pointers saves and restores the data pointed to.
    В принципе да, хотя кольцевой список как целевой контейнер и вообще кольцевые ссылки меня не очень вдохновляют. не думаю, что смогу это эффективно реализовать на первых стадиях.

  5. Proper restoration of pointers to shared data.
    Если речь о том, что указатели ptr1 и ptr2 одного типа указывали на один и тот же объект, то после десериализации они долны продолжать указыват на один и тот же объект, то реализация этого условия тесно связана с реализацией предыдущего.

  6. Serialization of STL containers and other commonly used templates.
    Да.

  7. Data Portability — Streams of bytes created on one platform should be readable on any other.
    Интересное требование, не думаю, что это будет реализовано.

  8. Orthogonal specification of class serialization and archive format. That is, any file format should be able to store serialization of any arbitrary set of C++ data structures without having to alter the serialization of any class.

    Скорее да, чем нет, хотя Windows INI files меня мало привлекают Скорее всего будет XML storage и binary storage. Есть идея сделать архив на основе OLE Structured Storage и RIFF

  9. Non-intrusive. Permit serialization to be applied to unaltered classes. That is, don't require that classes to be serialized be derived from a specific base class or implement specified member functions. This is necessary to easily permit serialization to be applied to classes from class libraries that we cannot or don't want to have to alter.
    Да, никаких специальных базовых классов или необходимых к реализации методов не будет. Только уже указанная мною маркировка, либо ручная реализация пары функций (маркировка проще, ручная реализация потребуется для STL — не патчить же STL)

  10. The archive interface must be simple enough to easily permit creation of a new type of archive.

    Архив должен уметь сериализовывать некоторый набор базовых типов (char, int, long, float, double, tagVARIANT)
    Архив должен поддерживать древовидную структуру.
    Значение получается по имени переменной.

  11. The archive interface must be rich enough to permit the creation of an archive that presents serialized data as XML in a useful manner.
    Да.

Что касается thread-safety то этого не будет.
Что касается unions, то можно делать так
SERIALIZABLE(union test)
 {
  char x;
  short y;
  SERIALIZABLE(int largest_var)
 }

но для объединений типа tagVARIANT это не приемлемо, поскольку там могут быть указатели. Такие вещи надо будет разруливать вручную. Благо это надо сделать только один раз.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.05 14:09
Оценка:
Здравствуйте, adontz, Вы писали:

Уточнение
  1. Independent versioning for each class definition. That is, when a class definition changed, older files can still be imported to the new version of the class.

    Выбор какие поля читать, а какие нет основыватся на наличии этих полей (для идентификации используется пара декорированное имя типа + имя поля) и выполняется автоматически. Никаких if (version > 3) read(advanced_field) не будет.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Проект сериализации [просьба высказаться]
От: Mamut Швеция http://dmitriid.com
Дата: 02.01.05 15:13
Оценка:
а чем его отличие будет от http://s11n.net/s11n/?
... << RSDN@Home 1.1.4 beta 3 rev. 241>> ... <<Winamp is playing "Track08">>


dmitriid.comGitHubLinkedIn
Re[4]: Проект сериализации [просьба высказаться]
От: yxiie Украина www.enkord.com
Дата: 02.01.05 15:15
Оценка:
Здравствуйте, adontz, Вы писали:

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


A>Уточнение

A>

    A>
  1. Independent versioning for each class definition. That is, when a class definition changed, older files can still be imported to the new version of the class.

    A>Выбор какие поля читать, а какие нет основыватся на наличии этих полей (для идентификации используется пара декорированное имя типа + имя поля) и выполняется автоматически. Никаких if (version > 3) read(advanced_field) не будет.

    A>

ну это уже мне не так интересно, т.к. будет заметно тормозить такую тривиальную (по нагрузке процессора) вещь, да и куча дополнительного места потребуется для ранения имен.
... << RSDN@Home 1.1.3 stable >>
Re[5]: Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.05 15:20
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>ну это уже мне не так интересно, т.к. будет заметно тормозить такую тривиальную (по нагрузке процессора) вещь, да и куча дополнительного места потребуется для ранения имен.


Ну зачем же так плохо? Можно хеш использовать. Будет +4 байта на переменную, а вовсе не куча дополнительного места.
К тому же это будет как-то так.
if (storage.exists(0x12345678)) read(012345678, &obj.field);

Где тут жуткая нагрузка?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.05 15:23
Оценка: 5 (1)
Здравствуйте, Mamut, Вы писали:

M>а чем его отличие будет от http://s11n.net/s11n/?


Идём сюда. http://s11n.net/s11n/sample.php

Грубо говоря, по объёму кодирования, нужен будет только первый листинг без второго.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.05 15:28
Оценка:
Здравствуйте, adontz, Вы писали:

Кстати появилась идея на счёт свойств. Типа так
template <typename _type>
SERIALIZABLE(class test)
    {
        void prop_set(int value);
        int prop_get();
        SERIALIZE_PROPERTY(int, prop_set, prop_get);
        SERIALIZE_VALUE(float var3);
    };

Уже описанное затронуто не будет.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Проект сериализации [просьба высказаться]
От: yxiie Украина www.enkord.com
Дата: 02.01.05 17:51
Оценка:
Здравствуйте, adontz, Вы писали:

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


Y>>ну это уже мне не так интересно, т.к. будет заметно тормозить такую тривиальную (по нагрузке процессора) вещь, да и куча дополнительного места потребуется для ранения имен.


A>Ну зачем же так плохо? Можно хеш использовать. Будет +4 байта на переменную, а вовсе не куча дополнительного места.

A>К тому же это будет как-то так.
A>
A>if (storage.exists(0x12345678)) read(012345678, &obj.field);
A>

A>Где тут жуткая нагрузка?

ну если ты будешь только CRC32 имени считать, то это уже лучше, хотя что делать проблемой, когда в классе переменная как была "somevar" так и осталась, а тип ее изменился? твое решение?
... << RSDN@Home 1.1.3 stable >>
Re[7]: Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.05 19:09
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>что делать с проблемой, когда в классе переменная как была "somevar" так и осталась, а тип ее изменился? твое решение?


Не буду её читать наверное Ведь старый тип не факт что как-то приводиться к новому. А что ты предлагаешь? Вот скажем был const char *, а стал std::string. И что мне делать? А если не std::, а что-то другое? Информация о типе потеряна — храним только 4 байта CRC (скажем два на имя переменной и два на тип, нам ведь нужно уникально только в пределах класса). Да пусть бы она и была. Вот есть скажем двоичное представление MFC::CString, как мне его в std::string превратить?
Тут правда есть выход если отказаться от двоичности хранения. Можно скажем писать/читать с установкой/проверкой типов и без неё. Тогда сериализовавшись из этого
SERIALIZABLE(class myclass)
 {
  public:
   SERIALIZE_VALUE(std::string name);
 }
в XML получим
<root>
 <myclass>
  <name>value of the string object</name>
 </myclass>
</root>

ИМХО вполне можно будет считать такое MFC::CString
Со строгой типизацией было бы как-то так
<root>
 <myclass>
  <std__string:name>value of the string object</std__string:name>
 </myclass>
</root>
или скажем так
<root>
 <myclass>
  <name __type="std::string">value of the string object</name>
 </myclass>
</root>

Кстати, наверное нужно уметь сериализовать и так
<root>
 <myclass>
  <name>value of the string object</name>
 </myclass>
</root>
и так
<root>
 <myclass name="value of the string object">
 </myclass>
</root>

С другой стороны не все хранилища поддерживают подобные различия. Как это всё по-удобнее размечать? Так хорошо?
SERIALIZABLE(class myclass)
 {
  public:
   SERIALIZE_VALUE(std::string name);
 }
SERIALIZABLE(class myclass)
 {
  public:
   SERIALIZE_ATTRIBUTE(std::string name);
 }
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[8]: Проект сериализации [просьба высказаться]
От: yxiie Украина www.enkord.com
Дата: 02.01.05 21:19
Оценка:
Здравствуйте, adontz, Вы писали:

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


Y>>что делать с проблемой, когда в классе переменная как была "somevar" так и осталась, а тип ее изменился? твое решение?

A>Не буду её читать наверное Ведь старый тип не факт что как-то приводиться к новому. А что ты предлагаешь?

версии

A>Вот скажем был const char *, а стал std::string. И что мне делать? А если не std::, а что-то другое? Информация о типе потеряна — храним только 4 байта CRC (скажем два на имя переменной и два на тип, нам ведь нужно уникально только в пределах класса). Да пусть бы она и была. Вот есть скажем двоичное представление MFC::CString, как мне его в std::string превратить?

A>Тут правда есть выход если отказаться от двоичности хранения. Можно скажем писать/читать с установкой/проверкой типов и без неё. Тогда сериализовавшись из этого
...
A>ИМХО вполне можно будет считать такое MFC::CString

тут даже дело не в string/CString/char*
что если сначала был CMySuperPuperClass rulez а стал — CMyMegaGigaClass rulez — и классы эти даже по смыслу никак не сопоставимы.
скорее всего действительно такие переменные не стоит читать, но тогда какая вообще польза от этого имени? только лишних 4 байта на переменную.

A>Со строгой типизацией было бы как-то так

...
A>С другой стороны не все хранилища поддерживают подобные различия. Как это всё по-удобнее размечать? Так хорошо?

черт его знает... ты хочешь, чтобы я тебе на гору выдал ответы на все вопросы бытия
в том то и дело, что сериализация штука хитрая и то что в одной ситуации хорошо, в другой — ужасно.
пока наилучшее решение, что я видел — это boost::serialization, другие подобно твоему тянут слишком много подводных камней, хотя может я просто плохо смотрел...
... << RSDN@Home 1.1.3 stable >>
Re[9]: Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.01.05 22:09
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>>>что делать с проблемой, когда в классе переменная как была "somevar" так и осталась, а тип ее изменился? твое решение?

A>>Не буду её читать наверное Ведь старый тип не факт что как-то приводиться к новому. А что ты предлагаешь?
Y>версии

Это как?

Y>тут даже дело не в string/CString/char*

Y>что если сначала был CMySuperPuperClass rulez а стал — CMyMegaGigaClass rulez — и классы эти даже по смыслу никак не сопоставимы.
Y>скорее всего действительно такие переменные не стоит читать, но тогда какая вообще польза от этого имени? только лишних 4 байта на переменную.

Нет, польза есть. Если был класс

SERIALIZABLE(class A)
 {
  SERIALIZE_VALUE(int x);
  SERIALIZE_VALUE(int y);
 }
а стал
SERIALIZABLE(class A)
 {
  SERIALIZE_VALUE(int y);
  SERIALIZE_VALUE(int x);
 }

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

Y>черт его знает... ты хочешь, чтобы я тебе на гору выдал ответы на все вопросы бытия


Я спрашиваю как лично тебе удобнее. Соберу мнения и будет мне счастие На все вкусы всё равно не сделать, но есть задумки. Хотелось бы не гнать пургу в одиночку, а посовещаться.

Y>пока наилучшее решение, что я видел — это boost::serialization, другие подобно твоему тянут слишком много подводных камней, хотя может я просто плохо смотрел...


ОК, тогда, как пользователь boost::serialization, расскажи, что там хорошо, а что не очень.
Какие вещи в моей идее не понятны и как аналогичные вопросы решены там.
Какие пути улучшения ты видишь и что самое главное не заморачивайся на то как это сделать, думай только о том, что надо сделать.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.01.05 00:17
Оценка:
template <typename _type>
SERIALIZABLE(class test)
    {
        SERIALIZABLE(int var1);
        SERIALIZABLE(_type var2);
        float var3;
    };

Подумал и решил поменять синтаксис.
template <typename _type>
class test
    {
        DECLARE_SERIALIZABLE;
        int var1;
        _type var2;
        float var3;
    };

Правда теперь фиг выберешь какие поля сериализации подлежат, а какие нет. Если нужно как-то хитро что-то делать, то удобный синтаксис идёт лесом...
Может это и очень-то и плохо и проблема надуманная Много ли классов в которых не все поля сериализуются?
Можно ещё конечно как-то так сделать.
template <typename _type>
class test
    {
        DECLARE_SERIALIZABLE;
        int var1;
        _type var2;
        unserializable<float> var3;
    };

при том что unserializable это простая обёртка для смены типа.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Проект сериализации [просьба высказаться]
От: McSeem2 США http://www.antigrain.com
Дата: 03.01.05 05:24
Оценка: 30 (1)
Здравствуйте, adontz, Вы писали:

A>
A>template <typename _type>
A>class test
A>    {
A>        DECLARE_SERIALIZABLE;
A>        int var1;
A>        _type var2;
A>        unserializable<float> var3;
A>    };
A>

A>при том что unserializable это простая обёртка для смены типа.

То есть, это должен быть некий препроцессор? Иначе как "int var1" может быть представлена в сериализации?

На мой взгляд, лучше так:

template <typename _type>
class test
    {
        serializable<int> var1;
        serializable<_type> var2;
        float var3;
    };


Во-вторых, мне не нравится подход с вычисленим хэш значений по типу и имени. Возможны конфликты, разрешать которые весьма дорого. А если не разрешать, то можно крупно нарваться. Во-вторых, для бинарной сериализации крайне важна компактность. Даже 4 байта для каждого поля — это слишком дорого. Наилучшим решением здесь будет ручное присвоение ID:

template <typename _type>
class test
    {
        serializable<int, 1> var1;
        serializable<_type, 2> var2;
        serializable<std::string, 3> str;
        float var3;
    };


В этом случае достаточно 1 байта, максимум — 2. В текстовом (XML) потоке — идентификация происходит по именам. Присвоение ID лично меня совершенно не напрягает, поскольку на одном уровне иерархии у нас обычно не более десятка атрибутов. Единственная проблема с ID — конфликты при наследовании, но наследовать сериализуемые классы друг от друга — это признак плохого дизайна. Я бы вообще запретил наследование в этом случае.

Далее, во многих случаях важна компактность данных. Например, недавно мы делали сериализацию для органических молекул, хранящихся в виде графов плюс аттрибуты для каждого атома/связи. Так вот, там не только недопустимо использовать 4-х байтовый хэш для типа/имени, но и все целые числа необходимо хранить компактно. В подавляющем большинстве случаев целые числа представлены одним байтом (диапазон 0...127 — 1 байт, 128...16383 — 2 байта и т.д). Это, плюс значения атрибутов по умолчанию позволило сократить объем данных более чем в 10 раз. При миллионах записей, да еще и гоняемых по сети, это очень существенно — 300 байт или 3K.

В принципе, аналогичную схему "компактификации" можно придумать и для float/double.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Проект сериализации [просьба высказаться]
От: c-smile Канада http://terrainformatica.com
Дата: 03.01.05 06:11
Оценка: 1 (1)
Здравствуйте, adontz, Вы писали:

A>Что скажете? Насколько это на ваш взгляд будет удобно/востребованно?


Честно говоря за все время что я программирую мне сериализация потрбовалась один раз.
И то в чужом проекте (MFC) где она и так использовалась.

Абстрактные мысли:

1) Сер-ия в двоичный формат и в XML "две большие разницы". Принципиально. В двоичном ты можешь гарантировать (относительно) что как записал так и прочитаешь. В XML — нет. Формат открытый и руками
в него может залезть каждый. Соотв. другие уровни проверок и "соломки на подстелить".

2) Как правило persisted data format это одно. А данные в памяти это другое. Простым mapping не обходится. У двух форматов представления разные задачи — один должен быть компактным (хранение) другой эффективным (в памяти)

Посмотри на POST (persistent object storage for C++, Константин Книжник)
Имхо у него толково сделаны примитивы описания метаданных.
У него правда бонус еще есть — там собственно нет сериализации Storage сразу после открытия
есть готовая к использованию структра объектов. Без их вычитывания в память.

Но в принципе если бы была а) простая б) компактная в) независимая ни от чего система загрузки скажем 100 записей трех разных типов классов я бы принял это на вооружение.
Re: Проект сериализации [просьба высказаться]
От: c-smile Канада http://terrainformatica.com
Дата: 03.01.05 06:26
Оценка: +1
Здравствуйте, adontz, Вы писали:

A>
A>template <typename _type>
A>SERIALIZABLE(class test)
A>    {
A>        SERIALIZABLE(int var1);
A>        SERIALIZABLE(_type var2);
A>        float var3;
A>    };
A>


Вот такая дурная идея:

А может лучше сосредоточится не на описании самого класса
а на создании удобных примитивов а ля MFC::CArchive?

Т.е. в принципе автоматизировать не сам класс, а его единственный метод
virtual persist(archive& ar)
{
persist(ar,var1);
persist(ar,var2);
}

с точки зрения трудозатрат написание SERIALIZABLE(int var1); эквивалентно persist(ar,var1)
и вся система получается а) гибче б) прозрачнее.

Нет?
Re[10]: Проект сериализации [просьба высказаться]
От: yxiie Украина www.enkord.com
Дата: 03.01.05 09:16
Оценка:
Здравствуйте, adontz, Вы писали:

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


Y>>>>что делать с проблемой, когда в классе переменная как была "somevar" так и осталась, а тип ее изменился? твое решение?

A>>>Не буду её читать наверное Ведь старый тип не факт что как-то приводиться к новому. А что ты предлагаешь?
Y>>версии

A>Это как?


так как в boost::serialization
    void serialize(Archive & ar, const unsigned int version)
    {
        // only save/load driver_name for newer archives
        if(version > 0)
            ar & driver_name;
        ar & stops;
    }


A>Я спрашиваю как лично тебе удобнее. Соберу мнения и будет мне счастие На все вкусы всё равно не сделать, но есть задумки. Хотелось бы не гнать пургу в одиночку, а посовещаться.


ну дак я уже и сказал. для меня лично:

Y>>пока наилучшее решение, что я видел — это boost::serialization, другие подобно твоему тянут слишком много подводных камней, хотя может я просто плохо смотрел...


A>ОК, тогда, как пользователь boost::serialization, расскажи, что там хорошо, а что не очень.

A>Какие вещи в моей идее не понятны и как аналогичные вопросы решены там.
A>Какие пути улучшения ты видишь и что самое главное не заморачивайся на то как это сделать, думай только о том, что надо сделать.

я как-бы не особо то и пользователь — на полную катушку в серьезном проекте еще не использовал, пока обкатываю на мелочах, но как по мне там хорошо все
сериализация там делается вручную и это хорошо, т.к. автоматизировать такие вещи без возникновения неоднозначностей врядли получится. совместимость между изменениями классов достигаются за счет версий, неплохая поддержка архивов. насчет улучшений ничего сказать не могу, т.к. "до предела" я ее не юзал.
все-таки boost::serialization не за пять минут на коленке делался и boost::serialization это boost::serialization, так что вполне логично, что решения там очень грамотные и продуманные.
... << RSDN@Home 1.1.3 stable >>
Re[3]: Проект сериализации [просьба высказаться]
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.01.05 13:00
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>То есть, это должен быть некий препроцессор? Иначе как "int var1" может быть представлена в сериализации?


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

MS>На мой взгляд, лучше так:

MS>
MS>template <typename _type>
MS>class test
MS>    {
MS>        serializable<int> var1;
MS>        serializable<_type> var2;
MS>        float var3;
MS>    };
MS>


ОК, принято. Осталось только написать класс шаблонный serializable так чтоб не было проблем с вызовом конструкторов и вперёд!

MS>Во-вторых, мне не нравится подход с вычисленим хэш значений по типу и имени. Возможны конфликты, разрешать которые весьма дорого. А если не разрешать, то можно крупно нарваться. Во-вторых, для бинарной сериализации крайне важна компактность. Даже 4 байта для каждого поля — это слишком дорого. Наилучшим решением здесь будет ручное присвоение ID:


MS>
MS>template <typename _type>
MS>class test
MS>    {
MS>        serializable<int, 1> var1;
MS>        serializable<_type, 2> var2;
MS>        serializable<std::string, 3> str;
MS>        float var3;
MS>    };
MS>


А вот мне это совершенно не нравиться Вручную вообще ничего не должно быть. Но в принципе можно сделать так.
В XML и прочих форматах записывается непосредственно строка с именем типа/переменной.
В двоичных форматах перед использованием типа делается оглавление вида
0: test<float>, fields
    {
        0: int = var1
        1: float = var2
        2: std::string = str
    };

а далее идёт запись вида
0:
    {
        0: 45;
        1: 3.67f;
        2: "qwerty"
    }

Для хранения номеров полей можно использовать схему типа UTF8 или даже действительно выделить 1 байт. Не будет же в одном классе больше чем 256 полей
Для хранения номеров классов лучше не жадничать и выделить 4 байта, потому что больше чем 65536 классом может быть запросто, а 3 байта как-то лево.
A journey of a thousand miles must begin with a single step © Lau Tsu