Псевдо-свойство только для чтения с сериализацией - PullRequest
2 голосов
/ 21 марта 2011

Как плохо это что-то вроде:

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

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

Ответы [ 2 ]

1 голос
/ 14 июня 2011

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

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

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

0 голосов
/ 21 марта 2011

Плохо, подумайте:

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

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

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

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

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