IXmlSerializable и неизменность - PullRequest
1 голос
/ 29 июня 2011

Я реализую IXmlSerializable в неизменяемом классе.Чтобы сохранить класс неизменным, я реализую интерфейс явно, чтобы скрыть методы, и использую статический метод ReadXml(), который инкапсулирует метод ReadXml(XmlReader reader) и, вместо этого, возвращает новый экземпляр моего класса.Однако, и если предположить, что класс называется ClassA, то, как я вынужден реализовать IXmlSerializable, подразумевает, что оператор

((ClassA)((IXmlSerializable)(ClassAObject)).ReadXml(reader))

фактически мутирует ClassAObject, поскольку внутриIXmlSerializable.ReadXml Я присваиваю параметры уже созданному объекту.Может ли ClassAObject все еще считаться неизменным?

Ответы [ 2 ]

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

номер

Явная реализация интерфейсов не предназначена для «сокрытия» методов - просто для избежания неоднозначностей, когда два интерфейса определяют элементы с одинаковой сигнатурой. Аспект «скрытия» также можно использовать, но только для предотвращения ошибок в вашем собственном коде - вы должны явно привести объект, что означает, что вы знаете, что делаете.

Добавлено: Однако ... возможно, вы можете довольно близко подойти к неизменяемому объекту, "заблокировав" его после вызова ReadXml(), поэтому дальнейшие обращения к нему вызовут исключение. Следовательно, объект становится неизменным после прочтения. Было бы замечательно, если бы вы также заблокировали объект, если он был построен другим конструктором, чем без параметров. В зависимости от того, почему вы изначально хотите неизменность, это может удовлетворить ваши потребности.

0 голосов
/ 12 ноября 2011

Я думаю, вы должны рассмотреть объекты передачи данных (DTO), которые будут иметь общедоступные методы получения / установки только для передачи сериализованных данных объекта.

...