![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Neobrat, я понял. спс.
Чумная вещь эта сериализация. С массивами объектов происходит жестяная штука. Сохраняется первый элемент массива и хоть кол теши. Причем в файле имею Кучу записей. И все заполнены первым элементом. Хотя массив содержит разные данные (тестировано). Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 14:10 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
Зачем? не проще..
код
работает. Ищите ошибки в своем коде. Зачем Вы приминаете сериализацию не совсем ясно. Это сообщение отредактировал(а) Neobrat - 10.5.2011, 14:46 |
||||||||
|
|||||||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Neobrat, WriteComponent из той же оперы
-------------------- Обижено школьников: 8 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Надо данные объекта сохранить. Но объекты в массиве. В динамическом массиве. И считываться должны в массив.
Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 14:50 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
CodeMonkey |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
На пальцах: сериализация в Delphi осуществляется на базе TPersistent, TComponent и TCollection.
TPersistent - это базовый класс, который можно сериализировать. Единственная проблема с ним в том, что по умолчанию его сериализирует TComponent. Сам TPersistent себя сериализировать не может. Это, впрочем, можно легко исправить. Поэтому, главный сериализируемый класс в варианте по умолчанию - TComponent. Далее, наборы из объектов сериализируются как составная часть объекта-контейнера. Таковыми (опять же, по умолчанию) в Delphi выступают TComponent и TCollection. Соответственно, для того, чтобы сериализовать массив из 3-х TComponent, их надо добавить в четвёртый TComponent, который будет контейнером, и сериализовать уже его. Обо всём остальном позаботится TComponent. Либо же, мы можем использовать TCollection и добавить 3 объекта в неё. И она нам всё засериализует. Это грубо, но наглядно. К сожалению, на руках у меня демки с TComponent и TCollection нет, а разбираться в вашем коде - нет времени, но вот здесь можно посмотреть пример сериализации одного объекта TPersistent и набора из трёх объектов TPersistent. Думаю, что это ещё лучше, чем TComponent и TCollection. Эта демка сохраняет и загружает один объект и коллекцию в бинарном и текстовом виде. Вот пример сохранения одного объекта в текстовом виде:
Вот пример сохранения коллекции в текстовом виде:
Это сообщение отредактировал(а) CodeMonkey - 10.5.2011, 15:02 -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
||||
|
|||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Neobrat, и какая разница:
Добавлено через 3 минуты и 29 секунд CodeMonkey, весьма благоДарен. Т.е. как я понимаю, засерилизовыать массив без применения TCollection или объекта-контейнера не получится? -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
"Зачем Вы приминаете сериализацию не совсем ясно. " Возможно не совсем правильно выразился. Какие предпосылки вынуждают использовать сериализацию? "Надо данные объекта сохранить. Но объекты в массиве. В динамическом массиве. И считываться должны в массив." Смотря что за объекты, что за данные и для каких целей. Лично мой взгляд, если нужны просто данные, то использовать рекорды. если используются объекты VCL, то встроенную сериализацию. если собственные объекты, то а) пишется своя реализация сериализации, а по русски говоря дописывается две функции LoadFile SaveFile, а так же объект "загрузчик" которые следит за целостностью файла и т.д. и т.п. б) используется XML у всех есть свои плюсы и минусы, которые я не вижу смысла обсуждать, каждый решает сам. в вашей же задачи я не вижу смысла использовать встроенную сериализацию, так как из обычной записи(читай набора байт) создаете VCL-ый объект. Добавлено через 5 минут и 48 секунд
мм.. не в ту сторону смотрите. чуток оптимизировал ваш код просто. |
||||||
|
|||||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Neobrat,
Вкратце Для чего это нужно: Записываются характеристики игрового персонажа. Персонаж скорее всего будет объектом. Так логичнее. Отсюда и сериализация И в чем оптимизация между FileStream.WriteComponent и MemoryStream.WriteComponent -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
по поводу оптимизации, опять же не туда смотрите.. избавились от лишнего стрима и посмотри код ObjectBinaryToText, оно вам надо? вопрос есть ли свойство у персонажа, которое не доступно для записи, но доступно на чтение, которое необходимо сохранять и подгружать? если есть, то попробуйте со стандартной сериализацией это провернуть. лично я скорее всего сделал бы "Загрузчик" и добавил две функции к персанажу LoadFile SaveFile либо стал бы использовать xml Это сообщение отредактировал(а) Neobrat - 10.5.2011, 15:39 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
ObjectBinaryToText, оно вам надо? Желательно. Чтобы можно было редактировать в обычном блокноте.
вопрос есть ли свойство у персонажа, которое не доступно для записи, но доступно на чтение, которое необходимо сохранять и подгружать? Нет. если есть, то попробуйте со стандартной сериализацией это провернуть. лично я скорее всего сделал бы "Загрузчик" и добавил две функции к персанажу LoadFile SaveFile Я тоже так хочу. либо стал бы использовать xml что есть XML и с чем го кушать. Добавлено @ 15:51 Почему отказался от рекордов: При записи строковых переменных переменной длины (они у меня входят в рекорд) возникают траблы. Добро пожаловать в ShortString
Это сообщение отредактировал(а) MetalFan - 13.5.2011, 18:52 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
по поводу xml, google в помощь. как раз там и сможете редактировать свойства и поддерживать версионость.
"Почему отказался от рекордов: При записи строковых переменных переменной длины (они у меня входят в рекорд) возникают траблы. Добро пожаловать в ShortString" 1. Признайтесь себе лично, реально ли у вас будут данные длиннее 255, из за чего вы не можете использовать ShortString; 2. Посмотрите куда смотрит указатель строки string и ShortString а так же посмотрите где лежит реальное начало строки, думаю поймете от куда грабли растут почему рекорды с обычным string не сохраняться.
3. если уж вам все таки надо использовать string с переменой длиной, то так как вы все равно делаете в объекте то в SaveFile пишите сначала длину строки а потом саму строку, ну и при загрузке наоборот сначала читаете длину, подготавливаете строку SetLength, или GetMem и т.п., и читаете саму строку |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Признайтесь себе лично, реально ли у вас будут данные длиннее 255
Дело совсем-совсем не в этом. Если они будут меньше 255, в файле будут барахтаться пустышки Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 16:29 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
мы помним что разговор начинался с того чтобы не делать этого вручную? ![]() -------------------- Обижено школьников: 8 |
|||
|
||||
PsiMagistr |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
bems, именно так.
Добавлено через 5 минут и 15 секунд если уж вам все таки надо использовать string с переменой длиной, то так как вы все равно делаете в объекте Если я делаю в объекте, то долой рекорд и да здравствует сериализация! -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
Neobrat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.8.2007 Репутация: нет Всего: нет |
мда.. ну и задачу вы себе выбрали..
не хотим что бы были пустышки и не хотим делать ручками.. кроме как пожелать вам удачи не чем помочь не могу. ) посмотрите в сторону IniFile может поможет ))))) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |