Как я должен обрабатывать Interning строки при десериализации? - PullRequest
5 голосов
/ 03 июня 2010

В приведенном ниже примере я вставляю строку в конструктор, что нормально. Однако, когда я десериализую объект из двоичного форматера, я не думаю, что строка будет интернирована, поскольку конструктор должен быть вызван. Как я должен убедиться, что строка _name интернирована? ... или это будет интернировано нормально?

Редактировать: Таким образом, похоже, что он работает (правильно интернирует строки) без обработки OnDeserializedAttribute. Как это сделать?

Я использую профилировщик памяти, с или без метода ниже он все еще интернирует строки? Магия? : - /

   [OnDeserializedAttribute]
   private void OnDeserialized(StreamingContext context)
   {
       _name = string.Intern(_name);
   }

Спасибо

[Serializable]
class City
{
    private readonly string _name;

    public City(string t)
    {
        _name = string.Intern(t);
    }

    public string Name
    {
        get { return _name; }
    }

    public override string ToString()
    {
        return _name;
    }
}

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Это возможно, если вы реализуете интерфейс ISerializable (не Атрибут). Это позволит вам сделать десериализацию.

Но это кажется очень ненужным. Вы уверены, что что-то делаете с этим?

0 голосов
/ 03 июня 2010

Посмотрите на OnDeserializedAttribute

...