Инструменты для отладки/проверки XML-сериализации

Существуют ли какие-либо инструменты для поддержки отладки/проверки процесса сериализации xml?

Например, предположим, что элемент помечен как внутренний, а не общедоступный. Отсутствует сообщение об ошибке времени компиляции или сообщение об ошибке времени выполнения. Если вы установите точку останова и перейдете в процесс сериализации, элемент просто пропущен. Другими словами, часто бывает трудно найти эти проблемы. Инструмент отладки позволит вам пройти процесс и предоставить некоторую обратную связь, например. столкнулся с этим атрибутом, повторил свойства и не нашел соответствующий публичный, пропустил. Другой вариант - это средство проверки, чтобы изучить все классы с атрибутами сериализации xml, чтобы убедиться, что они доступны, и установили методы и т.д.

Ответ 1

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

Например:

        public void Open(string filename)
        {

            // Create serializer
            XmlSerializer serializer = new XmlSerializer(typeof(ObjectType));

            // Set event handlers for unknown nodes/attributes
            serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode);
            serializer.UnknownAttribute += new  XmlAttributeEventHandler(serializer_UnknownAttribute);

...

        }

        private static void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
        {
            throw new System.NotImplementedException();
        }

        private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
        {
            throw new System.NotImplementedException();
        }

Ответ 2

Самый простой способ проверить эти проблемы (когда сериализация неполна или неверна) - это unit test - ничего сложного.

  • Создайте объект сериализуемого типа
  • Задайте все свойства
  • Сериализовать его
  • Возьмите сериализованный вывод и десериализуйте его в новый объект
  • Проверьте все свойства объекта, чтобы убедиться, что они все еще заполнены.
  • Сбой unit test, если какое-либо из свойств не настроено на ожидаемое значение

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

Ответ 3

Что значит "предмет". Если тип является внутренним, вы должны увидеть сообщение об ошибке. Самое внешнее исключение обычно не очень полезно, но прослеживается до .InnerException до нижней части, и обычно оно указывает точно, что проблема.

Если член полностью внутренне, то обязательно - он будет пропущен.

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

Например, попытка сериализации:

[XmlRoot("Node", Namespace="http://flibble")]
public class MyType {
    [XmlElement("chileNode")]
    public string Value { get; internal set; }
}

дает (во время выполнения):

Невозможно создать временный класс (result = 1). ошибка CS0200: свойство или индекс "MyType.Value" не может быть присвоено - он доступен только для чтения

что довольно специфично.

Ответ 4

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

Ответ 5

Что вы можете здесь сделать, это использовать инструмент SGen.exe из среды MS Visual Studio.

Запустив этот инструмент над своей сборкой, который содержит сериализуемые типы, он генерирует все версии XMLSerializer для вас в библиотеке с именем "{original-library-name".XmlSerializers.dll. "

Вам придется запускать его как средство командной строки (как, например, post-buildstep?), поскольку опция, доступная в "вариантах проекта", "не то, что вы ожидаете от нее" в соответствии с документацией. Превращение этого в Auto или On не всегда генерирует необходимые вам сборки.

После запуска этого инструмента у вас теперь есть библиотека, содержащая все сериализаторы для вашего проекта. Теперь вы можете использовать эту библиотеку, чтобы проверить, доступны ли ожидаемые сериализаторы.

Надеюсь, что это поможет,