Специальные геттеры и сеттеры для XMLSerializer - PullRequest
1 голос
/ 10 апреля 2011

У меня есть класс, который содержит ряд ресурсов, которые загружаются из файлов. Хотите сериализовать объекты этого класса в XML, но с путями к ресурсам вместо самих реальных ресурсов.

Сейчас я справился с этим, создав несколько полей ResourceSource, в которых хранится путь к ресурсу, и использовал XMLIgnore для самих ресурсов. Тем не менее, они должны быть публичными, что не очень хорошо.

Может показаться, что я действительно хочу иметь возможность создавать специальные методы доступа к свойствам, которые выполняются только XMLSerialize. Эта функция существует, или я могу ее реализовать?

В качестве альтернативы, я могу установить, чтобы мои поля ResourceSource были доступны только для XMLSerialize?

Ответы [ 2 ]

1 голос
/ 10 апреля 2011

Вы когда-нибудь рассматривали реализацию IXmlSerializable ? Это позволяет более точно контролировать процесс сериализации.

Есть две причины для реализации этого интерфейса. Во-первых, это управление тем, как ваш объект сериализуется или десериализуется с помощью XmlSerializer. Например, вы можете разбивать данные на байты вместо буферизации больших наборов данных, а также избегать инфляции, возникающей при кодировании данных с использованием кодировки Base64. Чтобы управлять сериализацией, реализуйте методы ReadXml и WriteXml для управления классами XmlReader и XmlWriter, используемыми для чтения и записи XML.

Вторая причина - возможность управлять схемой. Чтобы включить это, необходимо применить атрибут XmlSchemaProviderAttribute к сериализуемому типу и указать имя статического члена, который возвращает схему.

0 голосов
/ 10 апреля 2011

Звучит так, как будто ваш класс перегружен, чтобы выполнять несколько обязанностей, что почти всегда является красным сигналом того, что пришло время для некоторого рефакторинга.

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

...