Xml сериализация

Roman Mejtes

Возникла необходимость добавить к десериализацию класса добавление 2 полей, строка и позиция для 1 типа элементов.На данный момент, я вижу только 1 путь, как это сделать:наследовать интерфейс IXmlSerializable и накидать вот такую хрень
private void GetCurrentPosition(XmlReader reader, out int lineNumber, out int linePosition)
 {
 if (reader is IXmlLineInfo)
 {
 IXmlLineInfo lineInfo = (IXmlLineInfo)reader;
 lineNumber = lineInfo.LineNumber;
 linePosition = lineInfo.LinePosition;
 }
 else
 lineNumber = linePosition = -1;
 }

 public void ReadXml(XmlReader reader)
 {
 GetCurrentPosition(reader, out int lineNumber, out int linePosition);
 }
но проблема в том, что если я имплиментирую этот интерфейс, то все замарочки по десериализации этого класса ложатся на меня.Так как код десериализации в xml сериализаторе генерируется runtime вызвать какой то "базовый" метод для десериализации по атрибутам нельзя, так как он хз где вообще и как его найти. А структура элемента может быть довольно большая, с иерархией и прочей фигней.Писать десериализатор\сериализатор (реализовывать методы ReadXml, WriteXml) для данного класса мне совсем не улыбается. Возникает вопрос, как сделать это красиво, без боли и крови. Смысл простой, если класс наследует интерфейс IFoo, то десериализатор должен инициировать поля этого интерфейса с строкой и положением в строке.Может у кого есть, нормальные, здоровые решения.Гемороя добавляет еще и то, что классы модели генерируются из XSD файла и код может быть в любой момент перегенерирован.
2 ответа

Roman Mejtes

Не проще ли после сериализации пройтись по DOM-дереву, и расставить атрибуты?


Roman Mejtes

Не проще ли после сериализации пройтись по DOM-дереву, и расставить атрибуты?
тоже думал об этом варианте, но он не кажется мне "изящным" :) но видимо единственный верный в данной ситуации, жаль, что не предусмотрели это, хотя технически это не составляет большого труда. было бы на много круче, если бы можно было управлять генерацией кода