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

StackOverflow https://stackoverflow.com/questions/31799

Вопрос

ПРИМЕЧАНИЕ: XmlIgnore это НЕ ответ!

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

Я столкнулся с проблемами с парой классов, которые у меня есть, которые реализуют IEnumerable ( количество ) и ICollection ( Коллекция)<T>

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

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

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


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

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


Обновить

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

Это было полезно?

Решение

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

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

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

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

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

я полагаю, вы можете реализовать 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));
}
}

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

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

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

После этого вы сможете получить больший контроль над выводимым XML создаст

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top