![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Гость_guest |
|
|||
Unregistered |
как вычислить размер получившегося сериализованного класса после writecomponent ???
|
|||
|
||||
Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 80 Всего: 162 |
Что вы под этим понимаете? -------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
Гость_guest |
|
||||
Unregistered |
Ну есть к примеру класс:
Я его сериализую применяя:
Так вот нужно чтобы Stream.Size <= MaxSize !!!! Соответственно, нужно знать как зависит Stream.Size от класса TTest, к примеру если так есть поля integer, string, collection ??? |
||||
|
|||||
Jureth |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 23.11.2004 Где: где-то в Западной Сибири Репутация: нет Всего: 3 |
попробуй Sizeof (TTest)
|
|||
|
||||
Гость_guest |
|
|||
Unregistered |
не катит
Результат не правильный, и яркий пример тому тип string !!!!, а использовать string[размер] я не могу |
|||
|
||||
Alex |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 80 Всего: 162 |
длина строки вычисляется как Length(s)
-------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
|||
|
||||
Гость_guest |
|
|||
Unregistered |
Да не в этом дело....
А к том что при сериализации добавляется имя property и его содержимое, да плюс символы управляющие какие-то Вопрос в том как узнать какой получится размер потока ??? |
|||
|
||||
Alex |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4147 Регистрация: 25.3.2002 Где: Москва Репутация: 80 Всего: 162 |
Вот выдержка из хелпа
Если ты здесь не найдешь ответа на свой вопрос, то объясняй всю задачу, только по РУССКИ -------------------- Написать можно все - главное четко представлять, что ты хочешь получить в конце. |
||||
|
|||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Запиши TTest в промежуточный поток (ms : TMemoryStream), у этого потока возьми размер (ms.Size)... Если он больше, чем нужно, то записывай в Stream только часть ms ( s.WriteBuffer(ms.memory^, MaxSize); )...
Или тоже не про то говорю ? ![]() -------------------- С уважением, г-н Посол. |
|||
|
||||
Гость_guest |
|
|||
Unregistered |
p0s0l ты говоришь именно про то...
но вопрос не про то как прочитать нужный размер, а как этот размер вычислить заранее имея всего лишь класс !!!!??? Как происходит сериализация надо понять.... что пишется ??? |
|||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Компонент в поток пишется так:
1.Вначале пишется сигнатура TPF0 2.Имя класса (строка) 3.Имя компонента (строка) 4.Иногда пишется префикс с флагом 5.Пишутся published свойства 6.Конец (два нулевых байта) Строки пишутся так: <длина строки (1 байт)> <сама строка> Свойство пишется в том случае, если спецификатор stored этого свойства = True, и свойство либо не имеет default значение (директива nodefault), либо его значение отличается от default-значения... Left и Top свойства пишутся всегда. Своства пишутся в таком формате: 1.Имя свойства (строкой, т.е. еще размер имени вначале) 2.TValueType (1 байт) 3.Значение (разное кол-во байт) Например, запись свойства Tag: Если значение = 0 (default), то оно не пишется... Иначе, пишется вначале имя свойства: 3TAG (здесь 3 - это не символ, а значение байта) Далее пишется значение свойства: 1) Если значение <= 255, то пишется так: $02 $xx ($02 = vaInt8, тип значения, $xx - значение) 2) Если значение > 255, но <= 65535, то: $03 $xxxx ($03 = vaInt16) 3) И т.д. Короче, подсчитать размер вручную, програмно - дело непростое... Вовсю юзать RTTI придётся... И в итоге напишешь то же самое, что сделали Borland. Не легче ли сохранить в поток и узнать размер ? Если хочешь узнать подробнее - в Project Options вруби "Use debug DCU's" и пошагово в отладчике просмотри, что делается при записи компонента в поток... -------------------- С уважением, г-н Посол. |
|||
|
||||
Гость_guest |
|
|||
Unregistered |
Пасиб
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |