tag:blogger.com,1999:blog-8596733192274108952.post3951187334958397220..comments2024-03-12T06:00:18.305+02:00Comments on Programming stuff: List Visualizer и сериализация с использованием суррогатовSergey Teplyakovhttp://www.blogger.com/profile/14300835272589262297noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-8596733192274108952.post-86096125525302625092011-07-12T21:14:53.768+03:002011-07-12T21:14:53.768+03:00@geo: сори за задержку с ответом.
> Не понятно...@geo: сори за задержку с ответом.<br /><br />> Не понятно как происходит, если объект содержит несериализируемые проперти/филды:<br /><br />Все дело в том, что я реализовал так называемое "неглубокое копирование" (shallo copy) объектов. Т.е. в моем случае я сериализирую только поля "верхнего уровня" объекта и не стараюсь залазить в его внутренности слишком глубоко. Подходит этот вариант или нет, зависит от задачи, но я остановился на таком простом варианте по нескольким причинам. Во-первых, сериализация несериализируемых данных по определению задача не всегда хорошая. Ведь вы можете попытаться сериализовать объект, которых хранит дескриптор какого-то ресурса (типа IntPtr), в таком случае, побитовое копирование поля такого объекта может привести к непредсказуемым последствиям (поскольку два разных экземпляра попытаются освободить этот ресурс дважды). Во-вторых, корректная реализация обобщенного сериализатора дело сложное; для этого нужно значительно больше времени, чем у меня было для исследования этой темы и для решения моих практических задач.<br /><br />>Почему происходит повторный вызов GetObjectData/SetObjectData<br /><br />Ответ на этот вопрос тесно связан с вашим вторым вопросом:<br /><br />>Подскажи еще почему Flags именно BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Public?<br /><br />Все дело в том, что вы не можете напрямую, работая с производным типом получить с помощью рефлексии поля базового класса.<br /><br />Предположим, у вас есть иерархия классов:<br /><br />class Base {<br /> private int field1 = 5;<br />}<br /><br />class Derived {<br /> private int field2 = 10;<br />}<br /><br />Тогда, если у нас есть тип Derived, мы получим только поля, объявленные именно в этом типе, но не получим поля, объявленные в его базовом классе<br /><br />var type = typeof(Derived);<br />type.GetFields(BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);<br /><br />Этот код возвращает описание только одного поля: field2, а чтобы получить описание еще и поля базового класса (т.е. field1), нужно вызвать метод GetFields еще и у базового типа, класса Derived: type.BaseType.GetFields(...).<br /><br />Именно это и делает мой код, повторно вызывая SerializeFields для базового типа.<br /><br />А указанные BindingFlags я использую, чтобы получить открытые/закрытые экземплярные (не статические) поля, объявленные в этом типе.<br /><br />З.Ы. Я вроде бы повторно вызываю метод SerializeFields/DeserializeFields, а не GetObjectData/SetObjectData, но я надеюсь, что речь шла именно об этом.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-20477441335452514902011-07-04T18:57:54.188+03:002011-07-04T18:57:54.188+03:00Интересная статья.
Искал инфу по сериализации с ис...Интересная статья.<br />Искал инфу по сериализации с использованием суррогатов, но нашел мало. Вот спасибо вам за статью.<br />Есть вопросы. Не понятно как происходит сериализация объекта если он содержит не сериализуемые проперти/филды. Я думал что надо проверять для каждой проперти/филда, что тип IsSerializable и если нет, то рекурсивно вызывать SerializeFields, передавая в качестве объекта это проперти/филд, но оказалось что и без этого все работает.<br />Могли бы вы обяснить (или дать ссылки) как сериализуются такие проперти в объекте. Почему происходит повторный вызов GetObjectData/SetObjectData для них. Я думал что GetObjectData/SetObjectData вызывается только один раз.<br />Подскажи еще почему Flags именно BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Public?<br />Еще раз спасибо.geohttps://www.blogger.com/profile/15016197786148439077noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-90059682773323711062009-04-27T13:20:00.000+03:002009-04-27T13:20:00.000+03:00Нестандартный только заголовок окна, который опред...Нестандартный только заголовок окна, который определяется виндовой темой (тема называется Zune).<br />А все остальное - обыкновенная форма (WinForms), на которой расположено две панели DevExpress. На верхней панели - грид, на нижней - две кнопки. Плюс еще Bar от DevExpress. И все.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-61756728966984960532009-04-27T13:04:00.000+03:002009-04-27T13:04:00.000+03:00Я имею в виду саму форму и кнопки, у них нестандар...Я имею в виду саму форму и кнопки, у них нестандартный вид. Форма же не девэкспрессовская?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-30257542074267370162009-04-27T09:03:00.000+03:002009-04-27T09:03:00.000+03:00Это компоненты DevExpress. ОС: Windows XP. На вист...Это компоненты DevExpress. ОС: Windows XP. На висте или семерке - тоже будет так же красиво:)Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-17635920200012827122009-04-27T03:21:00.000+03:002009-04-27T03:21:00.000+03:00Сорри за оффтоп, но на скриншотах - это какая ОС и...Сорри за оффтоп, но на скриншотах - это какая ОС или что за софт что так выглядят окна? Красиво :)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-16712372011670779682009-02-20T11:30:00.000+02:002009-02-20T11:30:00.000+02:00По поводу Trace.WriteLine посмотри сюда http://ser...По поводу Trace.WriteLine посмотри сюда http://sergeyteplyakov.blogspot.com/2009/02/tracepoints.html. Тоже мог не знать о такой штуке.<BR/>По поводу своего визуализатора для собственных сложных классов - хорошая мысль. Поможет в отладке.<BR/>В моем сообщении почитай о суррогатах. Тоже интересно.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-75752999176118355232009-02-20T11:27:00.000+02:002009-02-20T11:27:00.000+02:00Интересная возможность.Честно говоря, не задумывал...Интересная возможность.<BR/>Честно говоря, не задумывался, что можно туда любой объект запихивать.<BR/>Пользовался только для DataTable & DataSet.<BR/>Но ИМХО оправдано использование таких приёмов только для часто используемых сложных классов, которые действительно сложно "обозреть" другими способами, например, тем же Trace.WriteLine в окно Output или в крайнем случае выводом в файл, которым я в подобных случаях пользуюсь.<BR/>Вообщем, задумался, а не написать ли мне такую штуку для семейства своих Rowset классов.Anonymousnoreply@blogger.com