Сериализация custom объекта в байт массив
От: vladt  
Дата: 23.06.04 10:42
Оценка:
Привет народ.

Есть задача сериализовать объект в байт массив
и потом восстановить его, сериализация в xml формате не подходит.
Может кто-нибудь уже писал такое, поделитесь алгоритмом,
а то велосипедировать не очень хочется.

Спасибо.
... << RSDN@Home 1.1.3 stable >>
Re: Сериализация custom объекта в байт массив
От: unrealalex Россия  
Дата: 23.06.04 10:53
Оценка:
Здравствуйте, vladt, Вы писали:

V>Привет народ.


V>Есть задача сериализовать объект в байт массив

V>и потом восстановить его, сериализация в xml формате не подходит.
V>Может кто-нибудь уже писал такое, поделитесь алгоритмом,
V>а то велосипедировать не очень хочется.

V>Спасибо.


посмотри на Boost Serialization Library
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
Re: Сериализация custom объекта в байт массив
От: ssm Россия  
Дата: 23.06.04 11:04
Оценка:
Здравствуйте, vladt, Вы писали:

V>Привет народ.


V>Есть задача сериализовать объект в байт массив

V>и потом восстановить его, сериализация в xml формате не подходит.
V>Может кто-нибудь уже писал такое, поделитесь алгоритмом,
V>а то велосипедировать не очень хочется.

V>Спасибо.


реализуй следующие методы:

std::istream &operator>>(std::istream &is, MyObj &obj);
std::ostream &operator<<(std::ostream &os, const MyObj &obj)



тогда сможещь просто писать и читать свой объект:

MyObj s;
std::cin >> s;
std::cout << s;
Re: Сериализация custom объекта в байт массив
От: _Winnie Россия C++.freerun
Дата: 23.06.04 11:20
Оценка: 18 (1)
Здравствуйте, vladt, Вы писали:

у меня есть что-то вот с таким интерфейсом. Если подойдет, могу кинуть свою сериализующую билиотечку на мыло...
На rsdn есть место, куда можно клсать свои файлы? Тогда лучше туда выложить (что бы всем), но я не что-то не вижу такого места. (там просто около 7 файлов, их неудобно на форум выкладывать)


#include <iostream>
#include <fstream>

#include "serialize/bin.h"
#include "serialize/vector.h"
#include "serialize/string.h"


//-------------------------------------
//Serialize X using global `Serialize` function

struct X
{
  X(float x, float y, float z, int t): x(x), y(y), z(z), t(t) {}
  X() {}
  float x, y, z;
  int t;
  int arr[10];
};

template <class C>
void Serialize(X &x, C &c)
{
  c(x.x)(x.y)(x.z)(x.t)(x.arr);
};


//-------------------------------------
//Serialize Y using global `Serialize` method

struct Y
{
  int i, j;
  template <class C>  void Serialize(C &c) { c(i)(j); }
};

//-------------------------------------
//Serialize Y using `SerializeAsPod` specialization


struct Pod
{
  int arr[20];
  float a,b,c;
};

template <> struct SerializeAsPod<Pod> { enum { value= true }; };

//-------------------------------------
//Serialize compound class XY using `Serialize` method

struct XY: Y
{
  enum  Enum { enum1, enum2 };

  Enum e;

  X x;
  Y y;
  Pod pod;
  std::string str;
  std::vector<float> floats;
  std::vector<std::vector<std::string> > strings;
  std::vector<Enum> enums;

  void Fill()
  { 
    e= enum1;
    enums.push_back(enum1);
    enums.push_back(enum2);
    enums.push_back(enum2);
    floats.push_back(1.33f);
    floats.push_back(2.33f);
    floats.push_back(3.33f);
    floats.push_back(4.33f);
    strings.resize(2);
    strings[0].push_back("string1");
    strings[0].push_back("string2");
    strings[0].push_back("string3");
    strings[0].push_back("string4");
    strings[0].push_back("string5");
    strings[1].push_back("string6");
    strings[1].push_back("string7");
    strings[1].push_back("string18");
    strings[1].push_back("string8");
    strings[1].push_back("string9");

    str= "hello, world!!!";

    x = X(1,3,4,5);

    for (int j=0; j<10; ++j)
      x.arr[j]= j;

    for (int j=0; j<20; ++j)
      pod.arr[j]= j;

    y.i= 77;
    y.j= 33;

    pod.a= 99;
    pod.b= -1;
    pod.c= -2;

    Y::i= -256;
    Y::j= -257;/**/
  }

  template <class C>  void Serialize(C &collector) 
  { 
    //TODO: why this do not work?   //.BaseClass<Y>(this)
    collector
      (*(Y*)(this))
      (x)
      (y)
      (pod)
      (str)
      (floats)
      (strings)
      (e)
      (enums)
      ;
  }
};


int main_test_serialize()
{
  using namespace std;
  {
    ofstream out_file("out.dat", ios::binary);
    BinaryOutput output(out_file);
    XY xy1;
    xy1.Fill();
    output((const XY&)xy1);
    //call destructor of out_file(flush and close)
  }
  {
    ifstream in_file("out.dat", ios::binary);
    BinaryInput input(in_file);
    XY xy2;
    input(xy2);
  }
  return 0;
}
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Сериализация custom объекта в байт массив
От: Кодт Россия  
Дата: 23.06.04 11:29
Оценка:
Здравствуйте, _Winnie, Вы писали:

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


_W>у меня есть что-то вот с таким интерфейсом. Если подойдет, могу кинуть свою сериализующую билиотечку на мыло...

_W>На rsdn есть место, куда можно клсать свои файлы? Тогда лучше туда выложить (что бы всем), но я не что-то не вижу такого места. (там просто около 7 файлов, их неудобно на форум выкладывать)

Место: форум "Исходники" (www.rsdn.ru/forum/?group=src)
Способ: загрузка на сервер (www.rsdn.ru/Tools/Private/FileList.aspx), затем в форуме указываешь ссылку на размещённый файл.
Перекуём баги на фичи!
Re[2]: Сериализация custom объекта в байт массив
От: vladt  
Дата: 23.06.04 13:15
Оценка:
Здравствуйте, _Winnie, Вы писали:

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


_W>у меня есть что-то вот с таким интерфейсом. Если подойдет, могу кинуть свою сериализующую билиотечку на мыло...

_W>На rsdn есть место, куда можно клсать свои файлы? Тогда лучше туда выложить (что бы всем), но я не что-то не вижу такого места. (там просто около 7 файлов, их неудобно на форум выкладывать)

Скинь, конешна.
Посмотрю может какие нибудь идейки почерпну
на ящик vp_2004@mail.ru
Re: Сериализация custom объекта в байт массив
От: Batiskaf Израиль http://www.mult.ru/
Дата: 24.06.04 08:03
Оценка:
Здравствуйте, vladt, Вы писали:

V>Привет народ.


V>Есть задача сериализовать объект в байт массив

V>и потом восстановить его, сериализация в xml формате не подходит.
V>Может кто-нибудь уже писал такое, поделитесь алгоритмом,
V>а то велосипедировать не очень хочется.

V>Спасибо.


Позвольте и мне вставить свои пять копеек:
Click Here
Автор: Batiskaf
Дата: 30.04.04


P.S.
Кстати может действительно мой топик двинуть в исходники, я надеялся на дискуссию на форуме С++, надеюсь в Исходниках интерес к рассматриваемой теме рефлексии будет больше.
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re: Сериализация custom объекта в байт массив
От: IceMage Россия  
Дата: 25.06.04 08:21
Оценка:
Здравствуйте, vladt, Вы писали:

V>Привет народ.


V>Есть задача сериализовать объект в байт массив

V>и потом восстановить его, сериализация в xml формате не подходит.
V>Может кто-нибудь уже писал такое, поделитесь алгоритмом,
V>а то велосипедировать не очень хочется.

V>Спасибо.


И такой еще вопрос — если объект достаточно нетривиальный вида например такого:

class SomeClass
{
    union
    {
        struct
        {
            unsigned int m_SomeBit1        : 1;
            unsigned int m_SomeBit2        : 1;
            unsigned int m_SomeBit3        : 1;
            unsigned int m_Reserved            : 5;
                }

                BYTE m_byte;
         }
public:
         ...
}


И его хотелось бы сериализовать в бинарник и XML. При том что SomeBit1 и т.д. хотелось бы видеть атрибутами в XML.

Спасибо.
Re[3]: Сериализация custom объекта в байт массив
От: _Winnie Россия C++.freerun
Дата: 27.06.04 02:04
Оценка:
Здравствуйте, Кодт, Вы писали:

_W>>у меня есть что-то вот с таким интерфейсом. Если подойдет, могу кинуть свою сериализующую билиотечку на мыло...

_W>>На rsdn есть место, куда можно клсать свои файлы? Тогда лучше туда выложить (что бы всем), но я не что-то не вижу такого места. (там просто около 7 файлов, их неудобно на форум выкладывать)


Прошу прощения, что так поздно, были проблемы... Но все-таки лучше, чем никогда Я еще сэмплы написал.

К>Место: форум "Исходники" (www.rsdn.ru/forum/?group=src)

К>Способ: загрузка на сервер (www.rsdn.ru/Tools/Private/FileList.aspx), затем в форуме указываешь ссылку на размещённый файл.

ВОТ:
http://www.rsdn.ru/File/23256/WSL.zip

К>

Правильно работающая программа — просто частный случай Undefined Behavior
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.