Есть задача сериализовать объект в байт массив
и потом восстановить его, сериализация в xml формате не подходит.
Может кто-нибудь уже писал такое, поделитесь алгоритмом,
а то велосипедировать не очень хочется.
Здравствуйте, vladt, Вы писали:
V>Привет народ.
V>Есть задача сериализовать объект в байт массив V>и потом восстановить его, сериализация в xml формате не подходит. V>Может кто-нибудь уже писал такое, поделитесь алгоритмом, V>а то велосипедировать не очень хочется.
V>Спасибо.
Здравствуйте, vladt, Вы писали:
V>Привет народ.
V>Есть задача сериализовать объект в байт массив V>и потом восстановить его, сериализация в xml формате не подходит. V>Может кто-нибудь уже писал такое, поделитесь алгоритмом, V>а то велосипедировать не очень хочется.
V>Спасибо.
у меня есть что-то вот с таким интерфейсом. Если подойдет, могу кинуть свою сериализующую билиотечку на мыло...
На rsdn есть место, куда можно клсать свои файлы? Тогда лучше туда выложить (что бы всем), но я не что-то не вижу такого места. (там просто около 7 файлов, их неудобно на форум выкладывать)
#include <iostream>
#include <fstream>
#include"serialize/bin.h"#include"serialize/vector.h"#include"serialize/string.h"//-------------------------------------
//Serialize X using global `Serialize` functionstruct 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` methodstruct Y
{
int i, j;
template <class C> void Serialize(C &c) { c(i)(j); }
};
//-------------------------------------
//Serialize Y using `SerializeAsPod` specializationstruct Pod
{
int arr[20];
float a,b,c;
};
template <> struct SerializeAsPod<Pod> { enum { value= true }; };
//-------------------------------------
//Serialize compound class XY using `Serialize` methodstruct 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
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, vladt, Вы писали:
_W>у меня есть что-то вот с таким интерфейсом. Если подойдет, могу кинуть свою сериализующую билиотечку на мыло... _W>На rsdn есть место, куда можно клсать свои файлы? Тогда лучше туда выложить (что бы всем), но я не что-то не вижу такого места. (там просто около 7 файлов, их неудобно на форум выкладывать)
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, vladt, Вы писали:
_W>у меня есть что-то вот с таким интерфейсом. Если подойдет, могу кинуть свою сериализующую билиотечку на мыло... _W>На rsdn есть место, куда можно клсать свои файлы? Тогда лучше туда выложить (что бы всем), но я не что-то не вижу такого места. (там просто около 7 файлов, их неудобно на форум выкладывать)
Скинь, конешна.
Посмотрю может какие нибудь идейки почерпну
на ящик vp_2004@mail.ru
Здравствуйте, vladt, Вы писали:
V>Привет народ.
V>Есть задача сериализовать объект в байт массив V>и потом восстановить его, сериализация в xml формате не подходит. V>Может кто-нибудь уже писал такое, поделитесь алгоритмом, V>а то велосипедировать не очень хочется.
V>Спасибо.
Позвольте и мне вставить свои пять копеек: Click Here
P.S.
Кстати может действительно мой топик двинуть в исходники, я надеялся на дискуссию на форуме С++, надеюсь в Исходниках интерес к рассматриваемой теме рефлексии будет больше.
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Здравствуйте, 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.
Здравствуйте, Кодт, Вы писали:
_W>>у меня есть что-то вот с таким интерфейсом. Если подойдет, могу кинуть свою сериализующую билиотечку на мыло... _W>>На rsdn есть место, куда можно клсать свои файлы? Тогда лучше туда выложить (что бы всем), но я не что-то не вижу такого места. (там просто около 7 файлов, их неудобно на форум выкладывать)
Прошу прощения, что так поздно, были проблемы... Но все-таки лучше, чем никогда Я еще сэмплы написал.
К>Место: форум "Исходники" (www.rsdn.ru/forum/?group=src) К>Способ: загрузка на сервер (www.rsdn.ru/Tools/Private/FileList.aspx), затем в форуме указываешь ссылку на размещённый файл.