сериализация формы
От: syrompe  
Дата: 19.07.04 13:25
Оценка:
Народ подскажите плз. возможно ли в принципе написать codeDOMSerializer именно для формы. Просто возникли следующая проблема: сериализатор (получаемый в методе Serialize) базового класса возвращает какой-то кривой код. Как правило это два вызова Me.SuspendLayout и Me.ResumeLayout.

Может кто имел опыт создания подобных вещей.
... << Rsdn@Home 1.1.4 beta 1 >>
Re: сериализация формы
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.07.04 20:10
Оценка:
Здравствуйте, syrompe, Вы писали:

S>Народ подскажите плз. возможно ли в принципе написать codeDOMSerializer именно для формы. Просто возникли следующая проблема: сериализатор (получаемый в методе Serialize) базового класса возвращает какой-то кривой код. Как правило это два вызова Me.SuspendLayout и Me.ResumeLayout.


S>Может кто имел опыт создания подобных вещей.


Думаю для формы не удастся. Дело в том, что формы как таковой нет. Ее эмулирует дизайнер. И код для вормы, если не ошибаюсь, захардкоден.

А что нужно то?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: сериализация формы
От: syrompe  
Дата: 20.07.04 08:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, syrompe, Вы писали:


S>>Народ подскажите плз. возможно ли в принципе написать codeDOMSerializer именно для формы. Просто возникли следующая проблема: сериализатор (получаемый в методе Serialize) базового класса возвращает какой-то кривой код. Как правило это два вызова Me.SuspendLayout и Me.ResumeLayout.


S>>Может кто имел опыт создания подобных вещей.


VD>Думаю для формы не удастся. Дело в том, что формы как таковой нет. Ее эмулирует дизайнер. И код для вормы, если не ошибаюсь, захардкоден.


VD>А что нужно то?

Нужно получить весь код находящийся в initializecomponent и по возсможности либо его модифицировать (запихав в if), либо добавить свой метод в класс формы.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[2]: сериализация формы
От: syrompe  
Дата: 20.07.04 08:45
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, syrompe, Вы писали:


S>>Народ подскажите плз. возможно ли в принципе написать codeDOMSerializer именно для формы. Просто возникли следующая проблема: сериализатор (получаемый в методе Serialize) базового класса возвращает какой-то кривой код. Как правило это два вызова Me.SuspendLayout и Me.ResumeLayout.


S>>Может кто имел опыт создания подобных вещей.


VD>Думаю для формы не удастся. Дело в том, что формы как таковой нет. Ее эмулирует дизайнер. И код для вормы, если не ошибаюсь, захардкоден.


VD>А что нужно то?


Дело в том, что написать сериализатор для формы это не проблема (установкой DesignerSerializer атрибута) проблема в том, чтобы получить обычный сериализтор для формы, то есть

Dim baseClassSerializer As CodeDomSerializer = CType(manager.GetSerializer( _
               GetType(System.Windows.Forms.Form), GetType(CodeDomSerializer)), CodeDomSerializer)

выдает какой то не тот сериализатор (он всегда выдает ровно два вызова me.suspendlayout и me.resumelayout)
... << Rsdn@Home 1.1.4 beta 1 >>
Re[2]: сериализация формы
От: syrompe  
Дата: 20.07.04 16:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, syrompe, Вы писали:


S>>Народ подскажите плз. возможно ли в принципе написать codeDOMSerializer именно для формы. Просто возникли следующая проблема: сериализатор (получаемый в методе Serialize) базового класса возвращает какой-то кривой код. Как правило это два вызова Me.SuspendLayout и Me.ResumeLayout.


S>>Может кто имел опыт создания подобных вещей.


VD>Думаю для формы не удастся. Дело в том, что формы как таковой нет. Ее эмулирует дизайнер. И код для вормы, если не ошибаюсь, захардкоден.


VD>А что нужно то?


Блин таки получилось!!
Сериализация делается абсолютно точно также как и в случае обычного компонента. Был глюк с тем, что resx файл от ранее удаленной формы почемуто остался и поэтому ничего не работало.
... << Rsdn@Home 1.1.4 beta 1 >>
Re: сериализация формы
От: PeterZT  
Дата: 20.07.04 17:11
Оценка: 6 (1)
Тебе нужен не обычный сериалайзер, а рутовый (RootDesignerSerizalizer)
Я воспользовался обычным хаком:
        private CodeDomSerializer GetVSSerializer()
        {
            Type _t = Type.GetType("System.ComponentModel.Design.Serialization.RootCodeDomSerializer");
            
            return Activator.CreateInstance(_t, true) as CodeDomSerializer;
        }

Думаю можно через GetService студийный сериайлазер вытащить если есть желание.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[2]: сериализация формы
От: syrompe  
Дата: 21.07.04 05:58
Оценка:
Здравствуйте, PeterZT, Вы писали:

PZT>Тебе нужен не обычный сериалайзер, а рутовый (RootDesignerSerizalizer)

PZT>Я воспользовался обычным хаком:
PZT>
PZT>        private CodeDomSerializer GetVSSerializer()
PZT>        {
PZT>            Type _t = Type.GetType("System.ComponentModel.Design.Serialization.RootCodeDomSerializer");
            
PZT>            return Activator.CreateInstance(_t, true) as CodeDomSerializer;
PZT>        }

PZT>

PZT>Думаю можно через GetService студийный сериайлазер вытащить если есть желание.

А можно по подробнее. Или ссылочку. В MSDN толком про это дело мало чего написано.
Интересуют следующие вопрсы:
1. Как я понял мне вместо обычного CodeDOMSerializer нужно реализовывать RootDesignerSerializer. Как это делать? В смысле от кого наследовать свой класс? И что за методы переопределять?
2. Допустим мы сделали свой RootDesignerSerializer. Как прикрутить его к моей форме? То есть сказать что это сериализатор сериализует именно мою форму?

Может исходниками поделишься?
... << Rsdn@Home 1.1.4 beta 1 >>
Re[3]: сериализация формы
От: PeterZT  
Дата: 21.07.04 06:39
Оценка:
Делаем базовый класс формы, его помечаем атрибутом RootDesignerSerializer и указываем свой сериализатор. После этого все наследники этлй формы будут сериализовываться через наш сериалайзер. Сериалйазер наследовать от обычного CodeDomSerializer. В методах Serialize, Deserialize создаешь рутовый сериалазйер по умолчанию и вмешиавешься в его работу по необходимости.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[4]: сериализация формы
От: syrompe  
Дата: 21.07.04 07:01
Оценка:
Здравствуйте, PeterZT, Вы писали:

PZT>Делаем базовый класс формы, его помечаем атрибутом RootDesignerSerializer и указываем свой сериализатор. После этого все наследники этлй формы будут сериализовываться через наш сериалайзер. Сериалйазер наследовать от обычного CodeDomSerializer. В методах Serialize, Deserialize создаешь рутовый сериалазйер по умолчанию и вмешиавешься в его работу по необходимости.


Спасибо помогло.
Интересно как ты это откопал?
... << Rsdn@Home 1.1.4 beta 1 >>
Re[4]: сериализация формы
От: syrompe  
Дата: 21.07.04 08:12
Оценка:
Здравствуйте, PeterZT, Вы писали:

PZT>Делаем базовый класс формы, его помечаем атрибутом RootDesignerSerializer и указываем свой сериализатор. После этого все наследники этлй формы будут сериализовываться через наш сериалайзер. Сериалйазер наследовать от обычного CodeDomSerializer. В методах Serialize, Deserialize создаешь рутовый сериалазйер по умолчанию и вмешиавешься в его работу по необходимости.


Еще один вопросик если можно.
Возникла проблемма с тем, что вызов type.gettype возвращает nothing, когда вызывается Deserialize при загрузке проекта. В остальных случаях (когда проект уже открыт) все работает нормально.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[5]: сериализация формы
От: syrompe  
Дата: 21.07.04 08:42
Оценка:
Здравствуйте, syrompe, Вы писали:

S>Здравствуйте, PeterZT, Вы писали:


PZT>>Делаем базовый класс формы, его помечаем атрибутом RootDesignerSerializer и указываем свой сериализатор. После этого все наследники этлй формы будут сериализовываться через наш сериалайзер. Сериалйазер наследовать от обычного CodeDomSerializer. В методах Serialize, Deserialize создаешь рутовый сериалазйер по умолчанию и вмешиавешься в его работу по необходимости.


S>Еще один вопросик если можно.

S>Возникла проблемма с тем, что вызов type.gettype возвращает nothing, когда вызывается Deserialize при загрузке проекта. В остальных случаях (когда проект уже открыт) все работает нормально.

Пришлось сделать так
        Dim baseClassSerializer As CodeDomSerializer = Activator.CreateInstance("System.Design", "System.ComponentModel.Design.Serialization.RootCodeDomSerializer").Unwrap


помогло
... << Rsdn@Home 1.1.4 beta 1 >>
Re[5]: сериализация формы
От: PeterZT  
Дата: 21.07.04 11:05
Оценка:
S>Спасибо помогло.
S>Интересно как ты это откопал?
Reflector в зубы и вперед
... << Rsdn@Home 1.1.4 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.