Предотвращение сериализации XML для IEnumerable и ICollection <T> и унаследованных типов

ПРИМЕЧАНИЕ: XMLIgnore НЕ является ответом!

Итак, следуя моему вопросу о Сериализация XML и унаследованные типы, я начал интегрировать этот код в свое приложение, над которым работаю, тупо думая, что все будет хорошо ...

I ran into problems with a couple of classes I have that implement IEnumerable and ICollection

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

Мое текущее решение - удалить реализацию интерфейса (в этом текущем приложении это не представляет особого труда, просто код стал красивее).

Должен ли я проглотить свою гордость по поводу этого и признать, что это невозможно? Я знаю, что я как бы подтолкнул и получил от XmlSerializer больше, чем от него ожидалось :)


Редактировать

Я также должен добавить, что сейчас я работаю во фреймворке 2.


Обновлять

Я принял Lomaxx ответ. В моем сценарии я не могу этого сделать, но знаю, что это сработает. Поскольку других предложений не было, я удалил реализацию интерфейса из кода.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
3 314
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

вы можете обойти эту проблему, получив dll System.RunTime.Serialization (это сборка .net 3.x) и сославшись на нее из своего приложения .net 2.0. Это работает, потому что двоичные файлы .net 3.0 скомпилированы для работы в среде CLR .net 2.0.

Делая это, вы получаете доступ к DataContractSerliazer, который я использовал, чтобы обойти аналогичную проблему, когда я хотел передать ICollection в качестве параметра веб-сервису, а xmlserializer не знал, как правильно с этим справиться.

Если вам нравится использовать dll .net 3.x в приложении 2.x, вы сможете использовать DataContractSerializer для решения этой проблемы.

Если вы используете эти атрибуты:

        [XmlArray("ProviderPatientLists")]
        [XmlArrayItem("File")]
      public ProviderPatientList Files
    {
        get { return _ProviderPatientLists; }
        set
        {
            _ProviderPatientLists = value;
        }
    }

Где ProviderPatientList наследует List<PatientList>

Затем вы можете иметь больший контроль над выводимым xml будет создавать

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

Я полагаю, вы можете реализовать IXmlSerializable для типа IEnumerable, чтобы обойти это поведение. однако это означает, что вы должны полностью контролировать процесс сериализации для этого типа. простой подход для того, чтобы не связываться с XmlReader / XmlWriter, вы можете написать вспомогательный класс адаптера xml с общедоступным ctor и общедоступными свойствами чтения-записи всех данных, которые будут сериализованы, и создать временный объект XmlSerializer для этого типа внутри IXmlSerializable. [Чтение | Запись] Xml ().

class Target : IEnumerable<Anything>, IXmlSerializable
{
//...

public void ReadXml(System.Xml.XmlReader reader)
{
    reader.ReadStartElement();
    TargetXmlAdapter toRead = (TargetXmlAdapter)new XmlSerializer(typeof(TargetXmlAdapter)).Deserialize(reader);
    reader.Read();

    // here: install state from TargetXmlAdapter
}

public void WriteXml(System.Xml.XmlWriter writer)
{
    // NOTE: TargetXmlAdapter(Target) is supposed to store this' state being subject to serialization
    new XmlSerializer(typeof(TargetXmlAdapter)).Serialize(writer, new TargetXmlAdapter(this));
}
}

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