Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Нативная сериализация объектов КОП (число прочтений - 14683 )
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Нативная сериализация объектов КОП
29. Мая 2008 :: 07:02
Печать  
Народ,
в продолжение темы http://www.1cpp.ru/forum/YaBB.pl?num=1207747517/0#5 и бага http://www.1cpp.ru/bugs/show_bug.cgi?id=3715

предлагаю обдумать схему нативной сериализации объектов КОП.
Зарегил баг http://www.1cpp.ru/bugs/show_bug.cgi?id=3881

Лично меня почти устраивает официальна дока
Цитата:
Экземпляры создаваемых классов можно сохранять в строку, а затем
восстанавливать из неё (сериализация КОП). Для этого в классе необходимо
определить следующие методы:

1. IsSerializable() рус. **КлассСохраняемый** () /Функция/, метод должен
  возвращать 1, если класс может быть восстановлен или записан в строку.
#. SaveToString() рус. **СохранитьКлассВСтроку** () /Функция/, метод должен
  возвращать строку, по которой потом можно будет восстановить состояние
  экземпляра класса. Реализация данной функции производится создателем
  класса.
#. LoadFromString(str) рус. **ЗагрузитьИзСтроки** (стр) /Процедура/, в данный
  метод передается строка ранее полученная из метода
  "СохранитьКлассВСтроку()", по которой можно восстановить состояние
  класса, существовавшее на момент сохранения.

Если в классе реализован метод "КлассСохраняемый()", который возвращает
значение, не равное 0, и реализован метод СохранитьКлассВСтроку(), то при
использовании функции 1С ЗначениеВСтрокуВнутр(ЭкзКласса) вернет строку,
сформированную в классе "ЭкзКласса" методом "СохранитьКлассВСтроку()".


При помощи решения kms после небольшой доработки восстановить класс можно через ЗначенияИзСтрокиВнутр(Строка).

Реализацию я уже выполнил, тесты проходят.

Основной вопрос, который у меня остался - в процессе восстановления класса из строки нужно ли вызывать конструктор или все действия должны производиться в процедуре ЗагрузитьИзСтроки

ИМХО конструктор нельзя вызывать.

Вот пример тестового кода
Код
Выбрать все
Процедура Тест_Сериализация() Экспорт
	Сам=Сам();

	ИмяСериализуемогоКласса = "СериализуемыйКласс";

	Объект = СоздатьОбъект(ИмяСериализуемогоКласса);

	Объект.ИзменитьАтрибуты();
	Сам.ПроверитьРавенство(Объект.Атрибут1, 2);
	Сам.ПроверитьРавенство(Объект.Атрибут2, 3);

	лСериализованноеПредставление = ЗначениеВСтрокуВнутр(Объект);
	Сам.ПроверитьТипЗначения(лСериализованноеПредставление, "Строка");
	Сам.ПроверитьНеравенство(Строка(лСериализованноеПредставление), "");
	Сам.ПроверитьРавенство(Объект.Журнал.стрЖурнал, "Конструктор, КлассСохраняемый, СохранитьКлассВСтроку");

	Объект = 0;

	Объект = ЗначениеИзСтрокиВнутр(лСериализованноеПредставление);
	Сам.ПроверитьТипЗначения(Объект, ИмяСериализуемогоКласса);
	Сам.ПроверитьРавенство(Объект.Журнал.стрЖурнал, "Конструктор, ЗагрузитьИзСтроки"); // ВОТ ЗДЕСЬ !!

	Сам.ПроверитьРавенство(Объект.Атрибут1, 2);
	Сам.ПроверитьРавенство(Объект.Атрибут2, 3);
КонецПроцедуры
 


  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #1 - 29. Мая 2008 :: 07:11
Печать  
А разве конструктор не вызовется когда ты будешь создавать новый объект класса

т.е. сначала отрабатывает конструктор а затем уже ЗагрузитьИзСтроки

  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #2 - 29. Мая 2008 :: 07:11
Печать  
Соответственно, можно будет любой класс закидывать в расшифровку печатной формы таблицы, например, или без проблем сохранять/восстанавливать в файл.
Существующая схема сериализации этого не позволяет без доп.кода Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #3 - 29. Мая 2008 :: 07:13
Печать  
Nick писал(а) 29. Мая 2008 :: 07:11:
А разве конструктор не вызовется когда ты будешь создавать новый объект класса

т.е. сначала отрабатывает конструктор а затем уже ЗагрузитьИзСтроки

Сейчас вызывается, но я же разработчик 1С++ Улыбка, поэтому для кода восстановления из строки могу отключить вызов конструктора, если мы с народом примем такую фичу Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #4 - 29. Мая 2008 :: 07:20
Печать  
artbear писал(а) 29. Мая 2008 :: 07:13:
Nick писал(а) 29. Мая 2008 :: 07:11:
А разве конструктор не вызовется когда ты будешь создавать новый объект класса

т.е. сначала отрабатывает конструктор а затем уже ЗагрузитьИзСтроки

Сейчас вызывается, но я же разработчик 1С++ Улыбка, поэтому для кода восстановления из строки могу отключить вызов конструктора, если мы с народом примем такую фичу Улыбка


А зачем?
Если там (в конструкторе) инициализируются какие-то внутренние переменные то в ЗагрузитьИзСтроки ты можешь их установить в какое тебе надо состояние, а если не надо то и не заморачиваешся с этим. Т.е. почему нельзя вызывать конструктор?
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #5 - 29. Мая 2008 :: 07:23
Печать  
ОФФ Кстати, Михаил, нужно слегка поправить реализацию CSerializeToString, иначе неверная работа Печаль
1. в CSerializeToString::Add вместо
Код
Выбрать все
if (FastCompare(szClassName, pRec->m_csClassName) || FastCompare(szInstanceName, pRec->m_csInstanceName))
 

лучше написать
Код
Выбрать все
if (!FastCompare(szInstanceName, pRec->m_csInstanceName)) 


для возможности работы с одинаковыми рантайм-классами, но разными инстанс-наименованиями - например, КОП-ы Улыбка
2. Далее CSerializeToString::LoadValueFromList
совершенно непонятен код
Код
Выбрать все
if (!pCont || FastCompare(pCont->GetRuntimeClass()->m_lpszClassName, pRec->m_csClassName));  


зачем здесь точка с запятой и FastCompare не сравнивается с нулем ??
Т.е. это код все равно не работает похоже Улыбка

Сам разберешься/поправишь или уж я добавлю заодно с ООП ? Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #6 - 29. Мая 2008 :: 08:17
Печать  
Я думаю, что вот так будет самое то:
Nick писал(а) 29. Мая 2008 :: 07:11:
т.е. сначала отрабатывает конструктор а затем уже ЗагрузитьИзСтроки

  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #7 - 29. Мая 2008 :: 09:18
Печать  
Нормальная сериализация - это безусловно хорошо  Улыбка

Про конструктор: думаю, что конструктор вызывать не надо. Сериализуемый объект должен сам знать, как ему восстановиться из строки. Конструктор - он ведь в основном нужен для установки начальных значений внутренних переменных, так? Если же в конструкторе выполняются какие-то странные действия - то кто нам мешает выполнить (или не выполнить) их при десериализации?
Десериализация это не штатное создание объекта. При десериализации объект возникает сразу и взрослым, а не проходит все стадии развития.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #8 - 29. Мая 2008 :: 09:25
Печать  
artbear писал(а) 29. Мая 2008 :: 07:23:
ОФФ Кстати, Михаил, нужно слегка поправить реализацию CSerializeToString, иначе неверная работа Печаль

В итоге сам выполнил коммит, тесты сериализации ИТ также проходят.
Сейчас выложу очередную сборку для тестирования.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #9 - 29. Мая 2008 :: 09:34
Печать  
ADirks писал(а) 29. Мая 2008 :: 09:18:
Нормальная сериализация - это безусловно хорошо  Улыбка

Про конструктор: думаю, что конструктор вызывать не надо. Сериализуемый объект должен сам знать, как ему восстановиться из строки. Конструктор - он ведь в основном нужен для установки начальных значений внутренних переменных, так? Если же в конструкторе выполняются какие-то странные действия - то кто нам мешает выполнить (или не выполнить) их при десериализации?
Десериализация это не штатное создание объекта. При десериализации объект возникает сразу и взрослым, а не проходит все стадии развития.

Вот-вот, я про это и говорю Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Нативная сериализация объектов КОП
Ответ #10 - 29. Мая 2008 :: 10:05
Печать  
1. Никакой конструктор не нужен, Леша дело говорит.
Класс должне восстанавливаться из строки полностью, никакое дополнительное конструирование не требуется.


Код
Выбрать все
if (!FastCompare(szInstanceName, pRec->m_csInstanceName))
 


2. Теперь можно. В первой редакции механизма нельзя было использовать.
Именно для этого переработан IV7SerializeToString и введены явные требования поддержки механизма от сериализуемых объектов.
"!" правильно добавил.

Код
Выбрать все
if (!pCont || FastCompare(pCont->GetRuntimeClass()->m_lpszClassName, pRec->m_csClassName));
 


3. Это хитрый код, который сразу не понять.
Реализация, видимо, впрочем, писалась глубокой ночью после литра самогона. Улыбка

4.
Свой код я исправлю сам.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #11 - 29. Мая 2008 :: 10:16
Печать  
По п.4 поздно, извини, но я уже поправил Улыбка, и все проверено на юнит-тестах.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Нативная сериализация объектов КОП
Ответ #12 - 29. Мая 2008 :: 10:18
Печать  
kms писал(а) 29. Мая 2008 :: 10:05:
"!" правильно добавил.

Хотя нет, не правильно.
Давай-ка я сам напишу, как должно быть.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Нативная сериализация объектов КОП
Ответ #13 - 29. Мая 2008 :: 10:20
Печать  
artbear писал(а) 29. Мая 2008 :: 10:16:
По п.4 поздно, извини, но я уже поправил Улыбка, и все проверено на юнит-тестах.

Не извиню.

Это часть уговора, давай-ка в дальнейшем согласовывать.
Несмотря на то, что-то кажется явным и неправильным.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #14 - 29. Мая 2008 :: 10:27
Печать  
1. Лады, я больше не буду Улыбка
Тогда жду твоей правки.

2. Еще вставь блок
{ // спец. блок для сторожа
     CComponentClass::SetFlagCreateWithoutConstructor();
     CComponentClass::GuardOfClearFlagCreateWithoutConstructor guard;

     pCont = CBLContext::CreateInstance(pRec->m_csInstanceName);
}
вместо простого
     pCont = CBLContext::CreateInstance(pRec->m_csInstanceName);

чтобы классы не создавались с конструктором.

Я проверил на своих тестах
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать