Удаление объектов, добавленных с использованием AddValue SerializationInfo - PullRequest
1 голос
/ 13 сентября 2010

Как я могу убедиться, что объекты удаляются, что я добавляю в SerializationInfo объект?

Например: если я добавляю хеш-таблицу к информационному объекту, как мне убедиться, что после сериализации нет живой ссылки на хеш-объект моего класса, и я могу как-то освободить память?

info.AddValue("attributesHash", attributesHash, typeof(System.Collections.Hashtable));


Обновление (код)

[Serializable]
class A : System.Runtime.Serialization.ISerializable
{
    List<int> m_Data = new List<int>();
    //...
    public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
    {
        if (m_Data != null)
        {
            info.AddValue("MyData", m_Data, typeof(List<int>));
            m_Data.Clear();
        }
        m_Data = null; // <-- Will this be collected by GC?
        GC.GetTotalMemory(true); //forced collection
    }
};

Мой вопрос: если я сделаю свой объект нулевым после добавления в список информации, будет ли он освобожден после вызова сериализации (когда информация уничтожена - я надеюсь), или в строке, когда вызывается функция GC (которую я не думаю)?

Если настройка 'm_Data = null' не пометит его как мусор, то как я узнаю, что память, занятая m_Data, освобождена или нет?

Ответы [ 3 ]

2 голосов
/ 13 сентября 2010

«Я могу как-то освободить память» и «объекты утилизируются» не очень хорошо ладят.

Управление памятью осуществляется ГХ. Как только больше нет ссылки на объект, он помечается для сбора мусора. Так что это касается управляемых ресурсов.

Утилизация, тем не менее, является совершенно другим животным и вызывает Dispose () для типов, реализующих IDisposable, и имеет дело с неуправляемыми ресурсами, такими как дескрипторы файлов и ресурсы Windows.

Вы должны уточнить, кого вы имеете в виду.

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

После долгого анализа я не думаю, что GC собирает память при запросе ... по крайней мере, в случае функции GetTotalMemory.

Установка нулевого объекта помечает его как мусор, но это не значит, что он будет немедленно собран.

0 голосов
/ 13 сентября 2010

Вам нужно сделать, чтобы ваш содержащий объект реализовал IDisposable. Но только то, что вы стали сериализованным, не означает, что вам также нужно избавляться. Ссылочный объект должен затем вызвать dispose после сериализации, если это то, что ожидается.

Что касается десериализованного объекта, он также должен быть удален по любым ссылкам на него, когда он будет использован (предположительно в другом домене приложения?). Так что это означает, что оба экземпляра должны быть ликвидированы. Если ресурс, которым вы делитесь, является единичным экземпляром (например, IntPtr), то вам, возможно, нужно быть более умным в этом, например, не утилизировать этот неуправляемый ресурс с этим объектом, а с более высокого уровня.

Общее правило: тот, кто его создает, распоряжается им.

Еще один распространенный шаблон, описанный в документации IDisposable , - это вызов Dispose () в ваш деструктор объектов. Это даст вам недетерминированное время для вашей утилизации, но гарантированно сработает (при условии, что у вас нет эталонных утечек).

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