Народ подскажите плз. возможно ли в принципе написать codeDOMSerializer именно для формы. Просто возникли следующая проблема: сериализатор (получаемый в методе Serialize) базового класса возвращает какой-то кривой код. Как правило это два вызова Me.SuspendLayout и Me.ResumeLayout.
Здравствуйте, syrompe, Вы писали:
S>Народ подскажите плз. возможно ли в принципе написать codeDOMSerializer именно для формы. Просто возникли следующая проблема: сериализатор (получаемый в методе Serialize) базового класса возвращает какой-то кривой код. Как правило это два вызова Me.SuspendLayout и Me.ResumeLayout.
S>Может кто имел опыт создания подобных вещей.
Думаю для формы не удастся. Дело в том, что формы как таковой нет. Ее эмулирует дизайнер. И код для вормы, если не ошибаюсь, захардкоден.
А что нужно то?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, syrompe, Вы писали:
S>>Народ подскажите плз. возможно ли в принципе написать codeDOMSerializer именно для формы. Просто возникли следующая проблема: сериализатор (получаемый в методе Serialize) базового класса возвращает какой-то кривой код. Как правило это два вызова Me.SuspendLayout и Me.ResumeLayout.
S>>Может кто имел опыт создания подобных вещей.
VD>Думаю для формы не удастся. Дело в том, что формы как таковой нет. Ее эмулирует дизайнер. И код для вормы, если не ошибаюсь, захардкоден.
VD>А что нужно то?
Нужно получить весь код находящийся в initializecomponent и по возсможности либо его модифицировать (запихав в if), либо добавить свой метод в класс формы.
Здравствуйте, 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)
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, syrompe, Вы писали:
S>>Народ подскажите плз. возможно ли в принципе написать codeDOMSerializer именно для формы. Просто возникли следующая проблема: сериализатор (получаемый в методе Serialize) базового класса возвращает какой-то кривой код. Как правило это два вызова Me.SuspendLayout и Me.ResumeLayout.
S>>Может кто имел опыт создания подобных вещей.
VD>Думаю для формы не удастся. Дело в том, что формы как таковой нет. Ее эмулирует дизайнер. И код для вормы, если не ошибаюсь, захардкоден.
VD>А что нужно то?
Блин таки получилось!!
Сериализация делается абсолютно точно также как и в случае обычного компонента. Был глюк с тем, что resx файл от ранее удаленной формы почемуто остался и поэтому ничего не работало.
Здравствуйте, 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. Как прикрутить его к моей форме? То есть сказать что это сериализатор сериализует именно мою форму?
Делаем базовый класс формы, его помечаем атрибутом RootDesignerSerializer и указываем свой сериализатор. После этого все наследники этлй формы будут сериализовываться через наш сериалайзер. Сериалйазер наследовать от обычного CodeDomSerializer. В методах Serialize, Deserialize создаешь рутовый сериалазйер по умолчанию и вмешиавешься в его работу по необходимости.
Здравствуйте, PeterZT, Вы писали:
PZT>Делаем базовый класс формы, его помечаем атрибутом RootDesignerSerializer и указываем свой сериализатор. После этого все наследники этлй формы будут сериализовываться через наш сериалайзер. Сериалйазер наследовать от обычного CodeDomSerializer. В методах Serialize, Deserialize создаешь рутовый сериалазйер по умолчанию и вмешиавешься в его работу по необходимости.
Здравствуйте, PeterZT, Вы писали:
PZT>Делаем базовый класс формы, его помечаем атрибутом RootDesignerSerializer и указываем свой сериализатор. После этого все наследники этлй формы будут сериализовываться через наш сериалайзер. Сериалйазер наследовать от обычного CodeDomSerializer. В методах Serialize, Deserialize создаешь рутовый сериалазйер по умолчанию и вмешиавешься в его работу по необходимости.
Еще один вопросик если можно.
Возникла проблемма с тем, что вызов type.gettype возвращает nothing, когда вызывается Deserialize при загрузке проекта. В остальных случаях (когда проект уже открыт) все работает нормально.
Здравствуйте, 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