ПРИМЕЧАНИЕ: XMLIgnore НЕ является ответом!
Итак, следуя моему вопросу о Сериализация XML и унаследованные типы, я начал интегрировать этот код в свое приложение, над которым работаю, тупо думая, что все будет хорошо ...
I ran into problems with a couple of classes I have that implement IEnumerable and ICollection
Проблема с ними в том, что когда XMLSerializer приходит для их сериализации, он рассматривает их как внешнее свойство, и вместо того, чтобы использовать свойство, которое мы хотели бы (то есть с нашим AbstractXmlSerializer), он приходит сюда и падает (из-за несоответствие типов), что в значительной степени возвращает нас к исходной точке. Вы также не можете украсить эти методы атрибутом XmlIgnore, поэтому мы не можем остановить его таким образом.
Мое текущее решение - удалить реализацию интерфейса (в этом текущем приложении это не представляет особого труда, просто код стал красивее).
Должен ли я проглотить свою гордость по поводу этого и признать, что это невозможно? Я знаю, что я как бы подтолкнул и получил от XmlSerializer больше, чем от него ожидалось :)
Я также должен добавить, что сейчас я работаю во фреймворке 2.
Я принял Lomaxx ответ. В моем сценарии я не могу этого сделать, но знаю, что это сработает. Поскольку других предложений не было, я удалил реализацию интерфейса из кода.





вы можете обойти эту проблему, получив 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));
}
}