Предотвращение сериализации XML для IEnumerable и ICollection <T>и унаследованных типов - PullRequest
4 голосов
/ 28 августа 2008

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

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

У меня возникли проблемы с парой классов, которые реализуют IEnumerable и ICollection

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

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

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


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

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


Обновление

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

Ответы [ 3 ]

4 голосов
/ 28 августа 2008

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

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

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

3 голосов
/ 26 июня 2009

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

Полагаю, вы можете реализовать IXmlSerializable для типа IEnumerable, чтобы обойти это поведение. однако это означает, что вы должны полностью контролировать процесс сериализации для этого типа. простой подход для того, чтобы не связываться с XmlReader / XmlWriter, вы можете написать вспомогательный класс адаптера xml с общедоступными свойствами ctor и public для чтения и записи всех данных, которые будут сериализованы, и создать временный объект XmlSerializer для этого типа . IXmlSerializable [Read | Write] 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));
}
}
1 голос
/ 28 августа 2008

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

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

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

После этого вы сможете лучше контролировать xml. создаст

...