| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Десериализовать себя? А так законно? |
| Автор: jonie 2.8.2008, 22:48 |
| тут была чушь. вопрос пусть такой будет: а как десериализовать самого себя (вариант с почленным присвоенимем не особо инетересен, мб есть что-нибудь вроде рефлексии...)? |
| Автор: mihryak 3.8.2008, 00:17 | ||
| десериализовать из чего? а в целом, можно и рефлексию задействовать например, через статический фабричный метод у объекта или стандартный десериализующий конструктор вот, набросал пример с бинарной сериализацией класса, который через рефлексию складывает при сериализации и забирает при десериализации через десериализующий конструктор свои приватные поля
|
| Автор: jonie 3.8.2008, 00:28 | ||
| до этого я дошел... в общем доопишу ситуацию (чего мне бы хотелось). итак. пусть у нас есть базовый класс :
пусть он умеет сериализоваться\десерелиазоваться кудато. теперь я хочу чтобы и все его потомки сереализовались и десериализовались, да так, чтобы они об этом даже "не знали". Т.е. без внесения в них какого-то кода вообще. С сериализацией все просто: метод виртуальный. Вызываем сериализацию для this. this будет указывать на потомка, и форматтер сам все сделает. А как десериализоваться? |
| Автор: mihryak 3.8.2008, 01:08 |
| ведь можно в базовом классе сделать что-то вроде моего кода - в базовом классе определить типы полей или свойств для сериализации, их вытаскивать через рефлексию в десериализации главным тогда станет вопрос, как создать инстанс именно нужного типа (при использовании форматтера это проблема отпадает, но появляются некоторые другие при этом делать указанные методы виртуальными, наверное, не стоит, раз потомки не должны вмешиваться в процесс и всё же - из чего и какими средствами планируется проводить (де)сериализацию? |
| Автор: jonie 3.8.2008, 01:17 | ||
| для (де)сериализации используетя soapformatter. виртуальность нужна для того чтобы иметь возможность писать такой код:
хочу также для десериализации 8-) но по умолчанию Soap форматтер бросает исключение, если не находит в Deriv десериализующего конструктора (что и понятно). вот думаю, а не написать ли свой форматтер, который будет искать конструктор и в предках, и использовать его..... |
| Автор: mihryak 3.8.2008, 01:44 | ||||
| да, десериализирующий конструктор нужен в наследниках.. но ведь и аттрубут [Serializable] тоже нужен. может, приемлимо будет принять соглашение об обязательном наличии в наследниках этого конструктора с пустым телом?
а виртуальность и правда не нужна, ведь this всегда будет правильного типа со своим собственным набором полей, так что всё будет работать дополнил свой тестик новым классом (привожу весь код, т.к. потребовались небольшие изменения в базовом классе - см. ниже)
получается, что никаких дополнительных действий по (де)сериализации отнаследованный класс не предпринимает, но он должен иметь атрибут Serializable и иметь пустой десериализующий конструктор ещё одно ограничение - все поля, которые нужно сериализовать из базового класса, должны быть хотя бы protected, иначе GetFields(), вызванный у наследника, их попросту не вернёт свой форматтер - это, конечно, хорошо, но если он нужен универсальный без ограничений, учесть все детали будет очень непросто, много подводных камней встретится |
| Автор: Idsa 3.8.2008, 08:15 | ||
| Тема топика - "сериализация самого себя" - напомнила мне фразу из одной книги по .NET:
|