У меня есть один визуализатор отладчика для просмотра списка объектов класса в виде таблицы данных. Но ограничение для кода заключается в том, что класс должен быть сериализуемым, т. Е. Должен быть помечен как [Serializable], а если класс не помечен Serializable, тогда отладчик сработает. Итак, может кто-нибудь сказать мне, как сделать класс Serializable во время выполнения, если класс не отмечен Serializable.Как сделать класс сериализуемым без Serializable attibute в .net
ответ
Если класс не помечен [Serializable]
, вы можете попробовать сериализации с помощью SerializationSurrogate
Вы не можете изменять метаданные существующего класса во время выполнения.
Есть ли альтернатива, что или нет никакого способа, чтобы достичь этого? –
@Ashwani, вы можете создать еще один класс, который инкапсулирует настоящий класс и который помечен 'Serializable', а затем будет работать с этим классом. –
Вы не говорите о разнице между режимами отладки и режима выпуска? –
Любой класс с общедоступными свойствами get/set является XmlSerializable. Можете ли вы использовать XML-сериализаторы?
Вы можете посмотреть на свой вопрос по-другому, используя [Serializable], чтобы использовать библиотеки dotnet для сериализации в json, xml и т. Д. Вы все же можете сериализовать, написав свои собственные методы, могут быть представлены в формате xml или json.
Добавление [Serializable] к классам - одна из лучших практических рекомендаций в блестящей книге Билла Вагнера Effective C#: 50 specific ways to improve your C#.
Вы можете сериализовать класс, не будучи [Serializable], поскольку @Darin (+1) указал, что вы не можете ретроспективно переопределить класс. Если бы я был вами, я бы поставил [Serializable], поскольку работа вокруг этого не стоит усилий.
Спасибо. Просто из любопытства, добавляет ли атрибут [Serializable] для класса какой-либо удар производительности? Я имею в виду, следует ли включать атрибут serializable для любого класса, который мы создаем? –
@ Ашвани Билл Вагнер рекомендует практику в Effective C# - у меня нет книги, но когда я прочитаю раздел о том, почему он должен быть по умолчанию, аргумент был убедителен. Этот ответ на SO подтверждает, что нет хита производительности - http://stackoverflow.com/questions/1402903/does-adding-serializable-to-the-class-have-any-performance-implications. – amelvin
Спасибо Амельвину. –
Тот факт, что класс отсутствует [Serializable], можно объяснить двумя способами. Это может быть ошибка упущения, более распространенный случай. Или класс может просто не поддерживать сериализацию. Что не является чем-то необычным, классы часто зависят от состояния, которое не может быть точно воспроизведено во время десериализации, поскольку оно зависит от состояния глобальной программы. Любой из элементов управления Windows Forms будет хорошим примером, их нельзя десериализовать без наличия собственного окна Windows, находящегося в требуемом состоянии, состояния, которое часто требует создания других окон (например, окна контейнера) и много сообщений.
Ну, это не поможет вам реализовать свой визуализатор. Вы не можете надежно реализовать его с сериализацией. Однако использование отражения дает вам доступ к тем же свойствам и значениям полей. И отражение всегда поддерживается.
Спасибо Рам. Я рассмотрю его –
Это все еще не решает мою проблему, но это помогло мне в изучении сериализации времени выполнения. Благодарю. –
Неработающая ссылка ..... https://msdn.microsoft.com/en-us/library/system.runtime.serialization.surrogateselector(v=vs.110).aspx – Brent