Что происходит при десериализации с этим?

StackOverflow https://stackoverflow.com/questions/111643

  •  02-07-2019
  •  | 
  •  

Вопрос

В настоящее время я конвертирую свое приложение ASP.NET v2 для сериализации / десериализации его объектов, потому что я хочу перейти из состояния сеанса inproc в stateserver.Это связано с тем, что мой хост, webhost4life, имеет неприятную тенденцию часто перезапускать рабочий процесс, что приводит к тайм-аутам сеанса.В любом случае...этот вопрос...

Я пытаюсь не сериализовывать то, что мне не нужно, т.е.переменные, которые повторно инициализируются на каждой странице, не нуждаются в сериализации.Вот один из них:

Частный RollbackQueue Как новая очередь (сервера данных.Откат)

При десериализации будет ли RollbackQueue а) ничем или б) пустой очередью?Я предполагаю, что когда .NET десериализуется, он создает родительский объект как обычно, а затем заполняет поля одно за другим.Следовательно, сработает НОВЫЙ бит.

Но это всего лишь предположение.

Спасибо, Роб.

Это было полезно?

Решение

Это ничего не даст.Логика сериализации CLR создаст объект, неинициализированный посредством Службы форматирования.Получает безопасный инициализированный объект без выполнения какой-либо логики построения.Если вам нужно убедиться, что поле имеет значение, я бы рекомендовал перенести такую инициализацию в Initialize() метод, который вызывается как из вашего конструктора, так и из метода, помеченного символом Ондесериализованный атрибут.

Другие советы

Почему бы не написать простое тестовое приложение, чтобы выяснить это?Вот один из них, который я написал (извините за 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

Теперь вы точно знаете, что при десериализации он будет равен null.Кент уже объяснил это в другом посте почему это так, и что вы можете с этим поделать, поэтому я не буду повторять это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top