0

Мой класс использует readonly WeakReference для хранения определенных данных. Этот класс также можно сериализовать через DataContract.Как обрабатывать WeakReference в DataContract сериализации?

Как я должен обрабатывать слабые ссылки? Я хотел бы, чтобы он возвращался как пустой (целевой нуль) после десериализации, как если бы он был собран.

Просто игнорируя вопрос не представляется возможным, потому что мой код правильно ожидает сама ссылка на объект будет ненулевым. Должен ли я отпустить readonly и вручную проверить для повторного создания слабого эталонного объекта во время безотказной работы?

ответ

1

Поскольку данные сериализаторов данных do not call the default constructor (or any other constructor), вам может потребоваться отпустить readonly. Вы можете сделать это несколько аппетитный, скрывая поле в свойстве ПОЛУЧИТЬ только вот так:

public class MyClass 
{ 
    WeakReference _m_private_reference_do_not_use_directly; 

    WeakReference Reference 
    { 
     get 
     { 
      if (_m_private_reference_do_not_use_directly == null) 
       Interlocked.CompareExchange(ref _m_private_reference_do_not_use_directly, new WeakReference(null), null); 
      return _m_private_reference_do_not_use_directly; 
     } 
    } 
} 

Другой вариант должен был бы короткого замыкания контракта данных сериализации для вашего класса с помощью making it implement ISerializable, а затем выделения WeakReference в protected MyClass(SerializationInfo info, StreamingContext context) конструктор. Но в этом случае я считаю, что лечение может быть хуже, чем болезнь.

DataContractSerializerdoes support OnDeserializedAttribute callback methods, так что вы можете выделять слабую ссылку there вместо проверки нуля каждый раз. Однако вам все равно придется отпустить readonly.

(Все это предполагает, что вы не хотите хранить данные с низкой ссылочной информацией, если они есть.)