В настоящее время я конвертирую свое приложение ASP.NET v2 для сериализации / десериализации его объектов, потому что я хочу перейти от состояния сеанса inproc к серверу состояний. Это связано с тем, что мой хост, webhost4life, имеет неприятную тенденцию часто перерабатывать рабочий процесс, вызывая тайм-ауты сеанса. В любом случае ... вопрос ...
Я пытаюсь не сериализовать то, что мне не нужно, то есть переменные, которые повторно инициализируются на каждой странице, не нуждаются в сериализации. Вот один из них:
Частная очередь отката как новая очередь (из DataServer.Rollback)
Будет ли RollbackQueue при десериализации а) пустой или б) пустой очередью? Я предполагаю, что когда .NET десериализует, он создает родительский объект как обычно, а затем заполняет поля одно за другим. Следовательно, сработает бит NEW.
Но это предположение.
Спасибо, Роб.





Ничего не будет. Логика сериализации CLR создаст объект, не инициализированный с помощью FormatterServices.GetSafeUnitializedObject, без выполнения какой-либо логики построения. Если вам нужно убедиться, что поле имеет значение, я бы рекомендовал перенести такую инициализацию в метод Initialize(), который вызывается как из вашего конструктора, так и из метода, отмеченного атрибутом OnDeserialized.
Почему бы не написать простое тестовое приложение, чтобы выяснить это? Вот тот, который я написал (извините, C# вместо VB, но сейчас у меня открыта версия VS2008 на C# Express).
[Serializable]
class TestClass
{
[NonSerialized]
public Queue<string> queue = new Queue<string>();
}
class Program
{
static void Main(string[] args)
{
var obj = new TestClass();
Console.WriteLine("Original is null? {0}", obj.queue == null);
var stream = new MemoryStream();
var formatter = new BinaryFormatter();
formatter.Serialize(stream, obj);
stream.Position = 0L;
var copy = (TestClass)formatter.Deserialize(stream);
Console.WriteLine("Copy is null? {0}", copy.queue == null);
Console.ReadLine();
}
}
Результатом этого будет
Original is null? False
Copy is null? True
Теперь вы точно знаете, что при десериализации он будет нулевым. Кент уже объяснил в другом посте Почему, что это так, и что вы можете с этим сделать, поэтому я не буду повторять это.