Как определить, какие классы сериализуемы - PullRequest
0 голосов
/ 16 августа 2010

Я меняю приложение ASP.NET на использование веб-фермы. Для этого мне нужно изменить состояние сеанса с in-proc на State Server. Для этого, насколько я понимаю, используемые классы должны быть помечены как сериализуемые. Как вы можете сказать, если это возможно с классом? Вы получите ошибку во время компиляции, если это невозможно?

Ответы [ 2 ]

1 голос
/ 16 августа 2010

Вы не получите исключение времени компиляции, так как время компиляции не знает, нужно ли сериализовать объекты.Вы получите SerializationException, когда IIS попытается сериализовать ваши объекты.

Вы можете написать короткий фрагмент, который пытается сериализовать и десериализовать рассматриваемые объекты ... используйте BinaryFormatter для выполнениясериализация и FileStream для записи.

ObjectBrowser скажет вам, реализует ли существующий класс ISerializable.Если вы смотрите на свои собственные объекты для сериализации, имейте в виду, что классы действительно должны быть предназначены для сериализации, если они предназначены для сериализации, в противном случае есть ошибки.Например, из справки MSDN:

Порядок десериализации объектов не может быть гарантирован.Например, если один тип ссылается на тип, который еще не был десериализован, произойдет исключение.

Я рекомендую прочитать в ISerializable ... вот ссылка: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx


РЕДАКТИРОВАТЬ: Вот простой пример сериализации и десериализации ... просто замените Exception Я сериализации на ваши собственные объекты:

BinaryFormatter formatter = new BinaryFormatter();

Exception serializedException = new Exception("Testing serialization");
Exception deserializedException;

using (FileStream fileStream = new FileStream(@"C:\SerializationTest.txt", FileMode.CreateNew)) {
    formatter.Serialize(fileStream, serializedException);
}

using (FileStream readStream = new FileStream(@"C:\SerializationTest.txt", FileMode.Open)) {
    deserializedException = formatter.Deserialize(readStream) as Exception;
}

if (deserializedException != null) {
    throw deserializedException;
}
1 голос
/ 16 августа 2010

В ответ на ваш первый вопрос о том, как определить, является ли класс сериализуемым, см. Следующее обсуждение. Как проверить, сериализуем ли объект в C #

К сожалению, .net удивил меня странным поведением, когда я пытаюсь сериализовать объекты, которые, по моему мнению, должны быть сериализуемыми.

Например, в моих проектах WCF я могу сериализовать и передавать DataSet объекты.Однако, если я пытаюсь сериализовать и передавать DataTable объекты, я получаю пустое значение DataTable.Мне потребовалось некоторое время, чтобы отследить это.

Поэтому я бы посоветовал вам сделать хотя бы какое-то элементарное тестирование того, что происходит, когда вы пытаетесь сериализовать пользовательские классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...