Показать сообщение отдельно
Старый 24.02.2009, 15:40   #9  
tourist is offline
tourist
Участник
 
21 / 14 (1) ++
Регистрация: 03.05.2006
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Быть может уже кто-нибудь сделал подобное, но рискну выложить ...

В RunBase добавляем метод
X++:
boolean checkContainmentTypes(container a, container b)
{
    int i;

    if(conlen(a) != conlen(b)) return false;

    for(i = 1;i<=conlen(a);i++)
    {
        if(typeof(conpeek(a,i)) != typeof(conpeek(b,i))) return false;
    }

    return true;
}
pack() наследника RunBase приобретает вид
X++:
public container pack()
{
    return [#list];
}
unpack() наследника RunBase приобретает вид
X++:
public boolean unpack(container packedClass)
{
    if(this.checkContainmentTypes([#list], packedClass))
        [#list] = packedClass;
    else 
        info(@'Сохраненный набор параметров для данного объекта не совпал по структуре с требуемым - значения восстановлены по умолчанию.');

    this.init();

    return true;
}
Не болит голова о версиях контейнера параметров - теперь версии никому никуда не уперлись.
Не болит голова о мусоре в SysLastValue - его просто не будет, ибо перезатрется .
Не болит голова о необходимости чистить SysLastValue - ибо просто не от чего его чистить.

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

Небольшой нюанс: такая проверка не спасет, если пакуется query:
X++:
public container pack()
{
  return [#currentVersion, #currentList, this.queryRun.pack()]
}
, в этом случае version все равно придется менять, если были изменения в запросе.