Псевдо-свойство только для чтения с сериализацией

Насколько плохо это что-то вроде:

public class Test
{
    private string pKey = null;
    public string Key { 
        get { return pKey; } 
        set { if (pKey==null) pKey=value;} 
    }
}

Это позволило бы мне использовать XMLSerializer с классом и убедитесь, что Key невозможно изменить после первоначальной настройки.

2 ответа

Решение

Я согласен, что моя первоначальная идея была плохой.

Теперь я знаю, что не существует способа сделать это, используя стандартный XML Serializer. Предложение 'ssg' не будет сериализовано, потому что оно не имеет общедоступного установщика.

Единственным выбором здесь является реализация IXmlSerializableили используя другой метод сериализации, например DataContractSerializer, Проблема с первым состоит в том, что каждый производный класса должен был бы также реализовать IXmlSerializable; проблема последнего заключается в том, что вы не можете использовать атрибуты или иметь большой контроль над сгенерированным XML.

Плохо, посмотрим:

test.pKey = null;
test.Key = 'my new key';

Мне удалось обойти вашу защиту (очевидно, вы могли бы добавить null проверьте метод set, чтобы исправить эту проблему).

Та же проблема может возникнуть, если десериализованный объект имеет null ключ, ключ все еще может быть установлен при первом обращении к нему... Похоже, что если вам нужна такая защита, вам, вероятно, стоит взглянуть на другой способ ее получения.

XMLSerializer накладывает ограничения на классы, которые вы используете с ним, и, пытаясь обойти эти ограничения, вы, скорее всего, вызовете путаницу. Если вы работаете в одиночном магазине, и вы единственный, кто просматривает код, это может быть менее проблематично (по крайней мере, пока вы не отойдете от кода в течение нескольких месяцев), однако для нескольких разработчиков В среде поведения вашего класса может возникнуть путаница. Например, вы скрываете присвоение, которое не работает, не выбрасывая исключение, поэтому операции присваивания будут компилироваться и выполняться, но не обновлять объект и не выбрасывать исключение, чтобы указать на сбой (что может привести к некоторому сложному отслеживанию ошибок).

Другие вопросы по тегам