23:48
Сериализация
Если у вас есть "мёртвая" структура, в которой только одни данные, её лучше всё равно не записывать на диск как побайтовую копию структуры в памяти (а потом так же считывать её обратно), по крайней мере по двум причинам.
1. Если вы случайно (случайно?!) перекомпилируете с другим выравниванием по границам байт, слов, двойных слов (#pragma pack(n)), вы из сохранённого файла нифига не прочтёте.
2. Если вам придётся изменить структуру (а её придётся изменить, даже если вы 100% уверены, что она никогда меняться не будет), файл опять-таки станет непригодным для чтения.
Ну а если структура не мёртвая, а в ней есть другие об'екты-классы с системой выделения памяти, то это вообще атас и вы дерьма не оберётесь (сам проверял) пытаясь сначала считать с диска об'ект как есть, а потом чинить указатели и прочее.
Если об'ект нужно сохранять на диск, очень лучше сделать отдельные функции по сохранению его на диск (или хотя бы в массив байтов) и по чтению с диска (это и называется сериализацией). Лучше всего делать их как методы класса (структуры). Они должны по одному читать (писать) поля об'екта (это может показаться очень муторным, тогда в можете воспользоваться одним трюком). При этом следует уделить особое внимание версии об'екта и записывать её тоже, чтобы при изменении формата об'екта (т.е. создании новой версии его) можно было продолжать считывать в него старые данные.
Благодарность за вразумление: himself'у.
1. Если вы случайно (случайно?!) перекомпилируете с другим выравниванием по границам байт, слов, двойных слов (#pragma pack(n)), вы из сохранённого файла нифига не прочтёте.
2. Если вам придётся изменить структуру (а её придётся изменить, даже если вы 100% уверены, что она никогда меняться не будет), файл опять-таки станет непригодным для чтения.
Ну а если структура не мёртвая, а в ней есть другие об'екты-классы с системой выделения памяти, то это вообще атас и вы дерьма не оберётесь (сам проверял) пытаясь сначала считать с диска об'ект как есть, а потом чинить указатели и прочее.
Если об'ект нужно сохранять на диск, очень лучше сделать отдельные функции по сохранению его на диск (или хотя бы в массив байтов) и по чтению с диска (это и называется сериализацией). Лучше всего делать их как методы класса (структуры). Они должны по одному читать (писать) поля об'екта (это может показаться очень муторным, тогда в можете воспользоваться одним трюком). При этом следует уделить особое внимание версии об'екта и записывать её тоже, чтобы при изменении формата об'екта (т.е. создании новой версии его) можно было продолжать считывать в него старые данные.
Благодарность за вразумление: himself'у.
12.01.2013 в 09:34
12.01.2013 в 19:21
12.01.2013 в 20:04
korrshun, то, что вы пишете, мне неведомо. Буду искать это, спасибо. Но хмл мне не подходит, потому что та хрень, которую мне надо сохранять внедрена в другую хрень, у которой заведомо двоичный формат. И вообще хмл вызывает у меня какое-то ощущение одновременно паттерна и анти-паттерна. Что, надо что-то сохранить? Лепим хмл не думая!
12.01.2013 в 20:21
по-моему мнению xml это тоже кроваво, с точки зрения времени обработки и того сколько оно жрет памяти,
но хорошо тем, что написана уже гора библиотек для него, есть условно полезные, пускай и монструозные стандарты (xsd, xml-rpc) и можно с такой-то матерью распарсить содержимое, даже если сам xml кривой по самое немогу - весь современный веб это доказывает.
12.01.2013 в 21:40
403 Forbidden
nginx
это ваша трогательная ссылка. И я кажется понял, почему пост гостя пустой.
13.01.2013 в 08:28