Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Присваивание


Автор: Гость_tokaplan 4.7.2003, 21:06
Как прированять один объект другому, чтобы в дальнейшем они не были связаны, если в этом классе нет Clone()? (Form)

Автор: stab 6.7.2003, 04:30
хм, ну можно попробовать покапать в сторону Serializing Objects, ms-help://MS.VSCC/MS.MSDNVS/cpguide/html/cpovrserializingobjects.htm

Автор: AntonSaburov 11.7.2003, 23:15
Вобщем-то идея с сериализацией неплохая.
Но тогда чем это проще чем реализовать Clone ?

Автор: stab 12.7.2003, 00:58
Цитата
Но тогда чем это проще чем реализовать Clone ?


тем что можно один раз написать код для сеарилизации\десеарилизации и использовать для любых объектов любого класса, ну почти для любых smile.gif Для этого надо использовать XmlSerializer, т.е. код такой:

Код

 private void SaveObjectToXMLFile(Type type, object obj, string path)
 {
  XmlSerializer xmls;
  FileStream strm;
 
  strm = new FileStream(path, FileMode.Create);
  xmls = new XmlSerializer(type);
  xmls.Serialize(strm, obj);
  strm.Close();
 }

 private object LoadObjectFromXMLFile(Type type, string path)
 {
  XmlSerializer xmls;
  FileStream strm;
 
  strm = new FileStream(path, FileMode.Open);
  xmls = new XmlSerializer(type);
  object result = xmls.Deserialize(strm);
  strm.Close();
  return result;
 }



использовать так:

Код

SomeType obj;

...

SaveObjectToXMLFile(typeof(SomeType), obj, "c:\\obj.xml");

...

obj = (SomeType) LoadObjectFromXMLFile(typeof(SomeType), "c:\\obj.xml");



на основе этого кода думаю будет не сложно сделать SaveToStream, LoadFromStream smile.gif и сохранять загружать откуда и куда угодно...

что печально, так это то что, для Form я не смог заставить этот код работать..., но для простых типов все работает, знать бы только те причины из-за которых для Form не работает. Где она мера простоты типа? smile.gif

з.ы. фактически все это выжимки из хелпа smile.gif

Автор: PRIZRAK001 3.1.2006, 01:27
Я только начинаю изучать C#, до этого писал на С++. И как новичка меня заинтересовала эта тема.

Почему всё так сложно (сериализация, метод Clone())?. Неужели нельзя просто взять и сделать копию объекта? Это не недоработок С# или специально задуманная фича?

Автор: lovermann 3.1.2006, 02:49
Это незнание предмета smile

Автор: mr.DUDA 3.1.2006, 12:24
Цитата(PRIZRAK001 @ 3.1.2006, 00:27)
Почему всё так сложно (сериализация, метод Clone())?. Неужели нельзя просто взять и сделать копию объекта? Это не недоработок С# или специально задуманная фича?

Согласен с lovermann, объясню почему. Допустим, есть у нас некий класс (во, в рифму сказал smile), хотим мы объект этого класса скопировать. Как прикажете рассматривать набор полей и свойств класса? Все считать копируемыми? Или только public? Может, ещё protected добавить? А свойства надо копировать или нет (учитывая, что свойство может быть вычисляемым или связанным с другим свойством/полем)? Хорошо, допустим выбрали мы (как разработчики .NET и C# smile) некий набор правил копирования, и теперь все разработчики знают, что копируются все поля, а свойства - нет. Отлично, допустим теперь появился некий Вася Пупкин, которому ну никак не подходит то, что свойство его класса не копируется, а поля он не хочет копировать, т.к. только что в институте ему объяснили принципы ООП, и теперь Вася Пупкин в праведном негодовании постит гневные сообщения на все программерские форумы рунета и в саппорт разрабам C# и .NET; те - в панике: "мы же всё предусмотрели!"... Вслед за Васей Пупкиным появляется Петя Иванов, который придумал свой собственный алгоритм копирования, позволяющий копировать не только поля и свойства, но и ресурсные файлы, связанные с классом. Затем появляется статья на codeproject.com, где приводится пример целого copy framework'а с кучей настроек. Через некоторое время появляются коммерческая библиотека FlexCopy, и несколько бесплатных аналогов. Все довольны, все дружно плюются в сторону "этих тупорылых мелкомягких, которые ничего сами не могут сделать как надо"...

Но, слава богу, в нашей реальности всё по-другому. Есть замечательный механизм сериализации, позволяющий настраивать с пом. атрибутов набор копируемых полей и свойств, а также дополнять и перекрывать метод Serialize. Есть интерфейс ICloneable. Никто не решает за тебя, как копировать объект.

Автор: Medved 3.1.2006, 12:59
Цитата(cully @ 12.7.2003, 03:58)
то печально, так это то что, для Form я не смог заставить этот код работать..., но для простых типов все работает, знать бы только те причины из-за которых для Form не работает. Где она мера простоты типа?


Чтобы твоя форма работала, необходимо чтобы все типы, которые она использует, были сериализуемыми (т.е. имели соответствующий атрибут)
Кроме того, сам класс твоей формы, должен быть помечен этим же атрибутом.
Прочитай про серилизацию в MSDN. Там об этом более подробнее сказано.

Автор: PRIZRAK001 3.1.2006, 13:44
mr.DUDA
Теперь понятно. Спасибо, что объяснил.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)