Предотвращение XML-сериализации IEnumerable и ICollection<T> и Унаследованные типы
-
09-06-2019 - |
Вопрос
ПРИМЕЧАНИЕ: 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 создаст