Что происходит при десериализации с этим? - PullRequest
2 голосов
/ 21 сентября 2008

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

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

Приватный откат. Очередь как новая очередь (DataServer.Rollback)

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

Но это предположение.

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

Ответы [ 2 ]

3 голосов
/ 21 сентября 2008

ничего не будет. Логика сериализации CLR создаст неинициализированный объект с помощью FormatterServices.GetSafeUnitializedObject без выполнения какой-либо логики построения. Если вам нужно убедиться, что поле имеет значение, я бы порекомендовал перенести такую ​​инициализацию в метод Initialize(), который вызывается как из вашего конструктора, так и из метода, помеченного атрибутом OnDeserialized .

0 голосов
/ 21 сентября 2008

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

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

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