Народ,
в продолжение темы
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);
КонецПроцедуры