Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Нативная сериализация объектов КОП (число прочтений - 14714 )
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 записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

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

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: Нативная сериализация объектов КОП
Ответ #16 - 29. Мая 2008 :: 10:36
Печать  
artbear

artbear писал(а) 29. Мая 2008 :: 10:27:
1. Лады, я больше не буду Улыбка

ОК.

Значит, смотри, Артур, какая ситуация.
Весь код, который был, был написан корректно.
Кроме ; - здесь да, спасибо.

Исправлено.

Теперь такое дело

1.
Код, который ты предлагал для изменения метода Add - нерабочий (а также "!" там не нужен).
Для разных классов и разных названий объектов нужны разные префиксы.

2. Для отмены конструирования выписываю тебе лицензию на модификацию кода создания объекта Улыбка
Но Артур, только на это, не ломай остальную логику, лучше еще раз обсудим, если надо.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #17 - 29. Мая 2008 :: 10:41
Печать  
kms писал(а) 29. Мая 2008 :: 10:36:
1.
Код, который ты предлагал для изменения метода Add - нерабочий (а также "!" не там не нужен).
Для разных классов и разных названий объектов нужны разные префиксы.

Да, согласен, я вспомнил, что этот код я вставлял вначале, когда тестил только один класс, а для работы с сериализацией нескольких классов пришлось уже юзать разные префиксы, я стал использовать имя КОП-а
типа так
Код
Выбрать все
try
{
	CSerializeToString::Add(m_NameOfInstance, GetOwner()->GetRuntimeClass()->m_lpszClassName, m_NameOfInstance);
}
catch (CSerializeToString::s_exception e) // может быть после сброса оптимизации для классов
{
}
 


  

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: Нативная сериализация объектов КОП
Ответ #18 - 29. Мая 2008 :: 10:43
Печать  
Во, зашибись.
Тогда, я так понимаю, мы практически у цели. Улыбка
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #19 - 29. Мая 2008 :: 10:47
Печать  
Может быть, сделать явный метод добавления для КОП-ов типа
Код
Выбрать все
void CSerializeToString::Add(IUserClassContext* pCont)
{
Add(pCont->GetTypeString(), pCont->GetRuntimeClass(), pCont->GetTypeString());
}
 

а?
  

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: Нативная сериализация объектов КОП
Ответ #20 - 29. Мая 2008 :: 10:50
Печать  
kms писал(а) 29. Мая 2008 :: 10:36:
2. Для отмены конструирования выписываю тебе лицензию на модификацию кода создания объекта Улыбка
Но Артур, только на это, не ломай остальную логику, лучше еще раз обсудим, если надо.

Залил.
Сборку выложишь?
  

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: Нативная сериализация объектов КОП
Ответ #21 - 29. Мая 2008 :: 11:00
Печать  
В доке для icpp также сделал изменения.
  

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: Нативная сериализация объектов КОП
Ответ #22 - 29. Мая 2008 :: 11:51
Печать  
Хехе, это типа ответ на http://www.1cpp.ru/forum/YaBB.pl?num=1212044576/24#24

Цитата:
artbear писал(а) 29. Мая 2008 :: 10:47:
Может быть, сделать явный метод добавления для КОП-ов типа
Код
Выбрать все
void CSerializeToString::Add(IUserClassContext* pCont)
{
Add(pCont->GetTypeString(), pCont->GetRuntimeClass(), pCont->GetTypeString());
}
 

а?

Да можно, сделаю.
Только не IUserClassContext, а чистый CBLContext, пожалуй.

Хотя здесь проблема.
pCont->GetTypeString() может возвращать разное значение при изменении языка по умолчанию в системе.

Начнет сериализовываться по-другому.
Перестанет десериализовываться, что еще хуже.

Нет, видимо, не стоит этого делать.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Нативная сериализация объектов КОП
Ответ #23 - 29. Мая 2008 :: 12:01
Печать  
Блин, опять вместо цитаты отредактировал.
Сейчас из буфера восстановлю, что было.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Нативная сериализация объектов КОП
Ответ #24 - 29. Мая 2008 :: 12:01
Печать  
Цитата:
Процитировано сообщение: artbear от Сегодня :: 14:47:56:
Может быть, сделать явный метод добавления для КОП-ов типа
Код
Выбрать все
void CSerializeToString::Add(IUserClassContext* pCont)
{
Add(pCont->GetTypeString(), pCont->GetRuntimeClass(), pCont->GetTypeString());
}
 



а?

Да можно, сделаю.
Только не IUserClassContext, а чистый CBLContext, пожалуй.

Цитата:
Процитировано сообщение: artbear от Сегодня :: 14:50:56:

Сборку выложишь?


Нет.

---

Артур, а вот здесь - ты не находишь, что это не здорово:
Код
Выбрать все
IUserClassContext() : CBLContext(1) {};
 


Интерфейс по определению не содержит реализации.
Ну, это так, просто как информация к размышлению.

Код
Выбрать все
CComponentClass::SetFlagCreateWithoutConstructor();
CComponentClass::GuardOfClearFlagCreateWithoutConstructor guard;
 


Не нравицца.
Может, стоит инкапсулировать оба действия в одном объекте?
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #25 - 29. Мая 2008 :: 12:03
Печать  
kms писал(а) 29. Мая 2008 :: 11:51:
Только не IUserClassContext, а чистый CBLContext, пожалуй.

Да, так проще. Только обозвать нужно как-то поприличнее, для обозначения разницы назначения Улыбка

kms писал(а) 29. Мая 2008 :: 11:51:
Артур, а вот здесь - ты не находишь, что это не здорово:
Код
Выбрать все
IUserClassContext() : CBLContext(1) {};
 


Интерфейс по определению не содержит реализации.
Ну, это так, просто как информация к размышлению.

Не придумал способа, как через в иерархии CComponentClass : IUserClassContext : CBLContext
при вызове конструктора CComponentClass вызвать конструктор CBLContext напрямую Печаль
Поэтому сделал только protected конструктор IUserClassContext - только для наследников!

kms писал(а) 29. Мая 2008 :: 11:51:
Код
Выбрать все
CComponentClass::SetFlagCreateWithoutConstructor();
CComponentClass::GuardOfClearFlagCreateWithoutConstructor guard;
 


Не нравицца.
Может, стоит инкапсулировать оба действия в одном объекте?

Самому не нравится Улыбка
Еще размышляю.

Сейчас сборку выложу.
  

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: Нативная сериализация объектов КОП
Ответ #26 - 29. Мая 2008 :: 12:04
Печать  
kms писал(а) 29. Мая 2008 :: 11:51:
Цитата:
artbear писал(а) 29. Мая 2008 :: 10:47:
Может быть, сделать явный метод добавления для КОП-ов типа
Код
Выбрать все
void CSerializeToString::Add(IUserClassContext* pCont)
{
Add(pCont->GetTypeString(), pCont->GetRuntimeClass(), pCont->GetTypeString());
}
 

а?

Да можно, сделаю.
Только не IUserClassContext, а чистый CBLContext, пожалуй.

Хотя здесь проблема.
pCont->GetTypeString() может возвращать разное значение при изменении языка по умолчанию в системе.

Начнет сериализовываться по-другому.
Перестанет десериализовываться, что еще хуже.

Нет, видимо, не стоит этого делать.

Логично Печаль
Тогда оставляем только IUserClassContext - там всегда наименование класса.
  

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: Нативная сериализация объектов КОП
Ответ #27 - 29. Мая 2008 :: 12:09
Печать  
Выложил новую сборку icpp с сериализацией.
Качайте, тестируйте.
  

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: Нативная сериализация объектов КОП
Ответ #28 - 29. Мая 2008 :: 12:12
Печать  
artbear писал(а) 29. Мая 2008 :: 12:04:
Логично Печаль
Тогда оставляем только IUserClassContext - там всегда наименование класса.

Ну а смысл тогда - оно и так у тебя один раз встречается.
Я-то хотел упростить подключение остальных классов типа CVTExtended...

Ну, могу тогда сделать что-то типа
Код
Выбрать все
void CSerializeToString::Add(LPCSTR szPrefix, CBLContext* pCont)
{
Add(szPrefix, pCont->GetRuntimeClass(), pCont->GetTypeString());
}
 


Т.е. префикс фиксирован, остальное - детали реализации.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #29 - 29. Мая 2008 :: 12:17
Печать  
kms писал(а) 29. Мая 2008 :: 12:12:
artbear писал(а) 29. Мая 2008 :: 12:04:
Логично Печаль
Тогда оставляем только IUserClassContext - там всегда наименование класса.

Ну а смысл тогда - оно и так у тебя один раз встречается.
Я-то хотел упростить подключение остальных классов типа CVTExtended...

Ну, могу тогда сделать что-то типа
Код
Выбрать все
void CSerializeToString::Add(LPCSTR szPrefix, CBLContext* pCont)
{
Add(szPrefix, pCont->GetRuntimeClass(), pCont->GetTypeString());
}
 


Т.е. префикс фиксирован, остальное - детали реализации.

+1 по обоим пунктам

Тогда, плиз, для большей ясности лучше так
Код
Выбрать все
void CSerializeToString::Add(LPCSTR szUniqueKey, CBLContext* pCont);
 


Потому что я, например, при первом просмотре хедера не понял, что все зависит от префикса.
  

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: Нативная сериализация объектов КОП
Ответ #30 - 29. Мая 2008 :: 12:27
Печать  
artbear писал(а) 29. Мая 2008 :: 12:17:
Потому что я, например, при первом просмотре хедера не понял, что все зависит от префикса.

ОК, я понял.
Добавлю поподробнее в описание.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #31 - 29. Мая 2008 :: 12:36
Печать  
Честно говоря, что-то мы от темы отошли, нужно было в разработку про исходники писать Улыбка
Но продолжим
Объясни, плиз, смысл кода
Код
Выбрать все
CBLContext* pCont = pVal->GetContext();
if (!pCont || FastCompare(pCont->GetRuntimeClass()->m_lpszClassName, pRec->m_csClassName))
 


Я не совсем понимаю Печаль, что он означает Печаль
Типа хочу знать детали реализации сериализации в 1С Улыбка
  

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: Нативная сериализация объектов КОП
Ответ #32 - 29. Мая 2008 :: 12:51
Печать  
Еще вопрос: могут ли быть исключения в обработчике LoadFromString ?
Какое будет поведение у 1С, если возникнет обычное рантайм-исключение 1С?
  

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: Нативная сериализация объектов КОП
Ответ #33 - 29. Мая 2008 :: 12:51
Печать  
artbear писал(а) 29. Мая 2008 :: 12:36:
Код
Выбрать все
CBLContext* pCont = pVal->GetContext();
if (!pCont || FastCompare(pCont->GetRuntimeClass()->m_lpszClassName, pRec->m_csClassName))
 


Я не совсем понимаю Печаль, что он означает Печаль
Типа хочу знать детали реализации сериализации в 1С Улыбка

pVal уже может содержать экземпляр контекста.
В этом случае создавать новый не нужно.
Но если это не так, или тип контекста не совпадает - необходимо создать новый с нужным типом.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Нативная сериализация объектов КОП
Ответ #34 - 29. Мая 2008 :: 12:52
Печать  
artbear писал(а) 29. Мая 2008 :: 12:51:
Еще вопрос: могут ли быть исключения в обработчике LoadFromString ?
Какое будет поведение у 1С, если возникнет обычное рантайм-исключение 1С?

Не знаю.
Думаю, допускать исключений не стоит.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #35 - 29. Мая 2008 :: 13:00
Печать  
kms писал(а) 29. Мая 2008 :: 12:52:
artbear писал(а) 29. Мая 2008 :: 12:51:
Еще вопрос: могут ли быть исключения в обработчике LoadFromString ?
Какое будет поведение у 1С, если возникнет обычное рантайм-исключение 1С?

Не знаю.
Думаю, допускать исключений не стоит.

Юнит-тесты показали, что все прекрасно, исключения в КОП::ЗагрузитьИзСтроки() прекрасно обрабатываются, как и обычные исключения, и 1С стабильно работает.
Это хорошо.
  

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: Нативная сериализация объектов КОП
Ответ #36 - 29. Мая 2008 :: 19:35
Печать  
artbear писал(а) 29. Мая 2008 :: 13:00:
Юнит-тесты показали, что все прекрасно, исключения в КОП::ЗагрузитьИзСтроки() прекрасно обрабатываются, как и обычные исключения, и 1С стабильно работает.
Это хорошо.

Юнит-тесты не могут дать гарантии безопасности исключений.
Скажем, от ликов абсолютно не страхуют.

P.S.
Впрочем, хорошо, если все работает стабильно.
Если бы ты знал, как в свое время в процессе разработки выглядел этот простой код - ты бы ужаснулся.

P.P.S.
Дополнительный Add решил вообще не делать.
Не правильно требовать существования конкретного экземпляра объекта в момент регистрации.
Короче, интерфейс признаем необходимым и достаточным и идем пить водку.
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Нативная сериализация объектов КОП
Ответ #37 - 30. Мая 2008 :: 03:25
Печать  
kms писал(а) 29. Мая 2008 :: 19:35:
artbear писал(а) 29. Мая 2008 :: 13:00:
Юнит-тесты показали, что все прекрасно, исключения в КОП::ЗагрузитьИзСтроки() прекрасно обрабатываются, как и обычные исключения, и 1С стабильно работает.
Это хорошо.

Юнит-тесты не могут дать гарантии безопасности исключений.
Скажем, от ликов абсолютно не страхуют.

P.P.S.
Дополнительный Add решил вообще не делать.
Не правильно требовать существования конкретного экземпляра объекта в момент регистрации.
Короче, интерфейс признаем необходимым и достаточным и идем пить водку.

Согласен по обоим пунктам.
  

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