Jon Joeney Ответов: 1

Как создавать XML-комментарии с помощью C# и [Serialize]


Hi, I am serializing a class in C# following this example

http://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.110).aspx

Here is my test class


[Serializable]
public class Test
{
   [XmlElement("SomeXmlElementName")]
   public int Something { get; set; }
}



This works well and creates and when the class content is serialized it creates a file with a node named SomeXmlElementName with the right value.

What I would also like is to include a comment in the XML file and I am looking for some .Net attribute I can use to decorate the method to include the comment. The code below does not compile, but it demonstrates the sort of thing I am after

[Serializable]
public class Test
{
   [XmlElement("SomeXmlElementName"), XmlComment("Some comment to include in the XML file when created"]
   public int Something { get; set; }
}


Does something like this exist at all?

Thank you

Sergey Alexandrovich Kryukov

Интересно, почему? Обычно сериализация XML не должна использовать никаких комментариев. Почему?
—СА

Jon Joeney

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

Sergey Alexandrovich Kryukov

Что за секунда!.. вы хотите сказать, что существует схема, которая определяет некоторые комментарии? Может быть, он даже должен был нести какую-то информацию в комментариях? "Расширение" схемы, которую вы не можете расширить?
Во всяком случае, я бы не стал делать таких вещей и посоветовал бы вам переосмыслить это. Слишком грязный подход, небезопасный и т. д...
—СА

rhyous

Xml может быть отображен на веб - страницах с помощью XSLT, очень похожего на HTML. Возможно, потребуется отобразить комментарии.

Кроме того, XML-файл может быть выведен вместе с Лицензионным соглашением в комментариях.

Sergey Alexandrovich Kryukov

Единственный правильный подход-игнорировать комментарии. Их следует использовать только по прямому назначению. Конечно, синтаксический анализатор XML может читать комментарии, но это не для чего-то вроде их отображения или интерпретации каким-либо образом. Почему бы не следовать дизайну XML?
—СА

rhyous

Я не согласен. Мы не говорим о чтении Xml и игнорировании комментариев. Мы говорим о написании и Xml и добавлении комментариев к написанному Xml.

C# - это не Xml. Сериализация-это возможность генерировать Xml-файл из объекта C#. Должен ли объект C# разрешать добавление комментариев? Думаю, так и должно быть. Комментарии в Xml являются частью спецификации для Xml.
http://www.w3.org/TR/REC-xml/#sec-comments

Сериализатор по умолчанию в C# не поддерживает добавление комментария к Xml-файлу, несмотря на то, что комментарии допустимы и поддерживаются в спецификации Xml.

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

Вербализация очень ясна, что процессору не требуется поддерживать комментарии, но это может быть. В этом случае мы даже не говорим о чтении комментария, мы говорим о написании Xml с комментариями.

Я ничего не видел о генераторе Xml или сериализаторе, но можно предположить, что если бы комментарии не предназначались для написания, они не добавляли бы их в спецификацию. Независимо от того, передаем ли мы ремесло и xml или генерируем Xml, комментарии важны.

У меня были запросы на добавление комментариев в каждый Xml, который я когда-либо сериализовал. Либо от тестировщиков программного обеспечения, технической поддержки, либо по причинам включения Лицензионного соглашения.

Чтобы удовлетворить такие запросы, я должен свернуть свой собственный сериализатор.

Sergey Alexandrovich Kryukov

Ваша точка зрения принята. Если это двусторонний процесс, вы должны сохранить комментарии.
—СА

Andreas Gieriet

Чего вы пытаетесь достичь? Комментарии-это конструкция времени компиляции, сериализация-это концепция времени выполнения. Во время выполнения у вас нет комментариев к исходному коду.
Что вы можете сделать, так это добавить свойство с именем AdditionalRuntimeInfo или аналогично и передать какую-то строку или другую согласованную конструкцию данных.
Овации
Энди

Jon Joeney

Код, который я хочу, я нашел здесь, он выглядит очень просто, и он работает
http://stackoverflow.com/questions/7385921/how-to-write-a-comment-to-an-xml-file-when-using-the-xmlserializer

Andreas Gieriet

Ну, это заманчиво, но пример-дерьмо: если имя свойства нуждается в таком комментарии, измените имя свойства соответственно, например сделайте его ApplicationVersion вместо того чтобы только Version и комментирование становится устаревшим. Если метки времени являются релевантной информацией для передачи из пункта А в пункт Б, добавьте их в схему.
Я знаю, реальность не всегда позволяет контролировать всю цепочку. Но если это находится под вашим контролем, я бы сказал, что подход к комментариям-это хак.
Овации
Энди

Jon Joeney

XML-схема определяется сторонней компанией. Я не могу пойти менять его волей неволей и все еще ожидать поддержки поставщика

Andreas Gieriet

Я все еще удивляюсь, почему вы хотите иметь эти комментарии в XML. Почему недостаточно иметь его только в качестве комментария кода в классе? Сериализованные данные вряд ли читаются людьми, не так ли? Кто должен прочитать этот комментарий в сериализованных данных? Ты нашел способ сделать это, отлично. Если это действительно полезно - другой вопрос. Вы сами для себя решили что это так ;-)
Овации
Энди

rhyous

Цитата: сериализованные данные вряд ли читаются людьми, верно?

Неправильный. Xml читается людьми. Отсюда и необходимость в комментариях.

В любом случае, ваши аргументы ошибочны.

Почти никогда != никогда.

По вашей логике, поскольку большая часть кода читается только одним человеком (так что вряд ли когда-либо), мы должны удалить функцию комментариев в коде. Комментарии все равно удаляются, когда он компилируется, верно?

Цитата: какова на самом деле цель этого? Кто должен прочитать этот комментарий в сериализованных данных?

Я уже ответил на ваш вопрос выше, когда сказал::

У меня были запросы на добавление комментариев в каждый Xml, который я когда-либо сериализовал. Либо от тестировщиков программного обеспечения, технической поддержки, либо по причинам включения Лицензионного соглашения.

Понимаете ли вы, для чего используется Xml? Это не просто код для кода.

Как часто вы открывали xml-файл (web.config, app.config) в Visual Studio и не видели некоторых комментариев по умолчанию?

Это язык разметки и используется по многим причинам, так много, что мы, как разработчики, никогда не могли перечислить или понять их все. Во многих из этих применений Xml часто рассматривается человеком и поэтому нуждается в комментариях.

Andreas Gieriet

Хм, Интересно, почему вы все это придумали после более чем двухлетнего первоначального поста...
Будьте уверены, что я вижу много применений XML в повседневной работе.
Однако в своей вселенной я рассматриваю функцию *сериализации* как средство переноса объектов в *некотором* формате через границы процесса и сохранения данных в *некотором* формате для последующего извлечения (не обязательно предназначенного для чтения людьми). Существует множество форматов сериализации, одним из которых является XML. например, компилятор C++ может сериализовать свои объекты из памяти в файл ELF, а компоновщик снова де-сериализует файлы ELF и работает внутренне с де-сериализованными объектами, чтобы связать их.
Если мне нужен XML-файл, который читается людьми, то я хочу контролировать гораздо больше, чем просто добавлять комментарии, например, отступы и т. д.
На мой взгляд, сериализация в ее более узком смысле-это не инструмент для создания красиво отформатированных и красиво прокомментированных файлов. Итак, я хочу сказать, что если вы хотите иметь контроль, который выходит за рамки базовой сериализации, вам, возможно, придется изобрести свой собственный (де-)сериализатор.
Кстати: Вы, кажется, неправильно меня поняли, сказав, что я не ценю ценность комментариев.
С уважением
Энди

1 Ответов

Рейтинг:
2

Andreas Gieriet

Смотрите мой комментарий к вашему вопросу.
Если вы хотите написать произвольный XML-код, вы можете взглянуть на Учебник Класса XmlWriter[^] и Написание XML с помощью XmlWriter[^] а также Объектная модель XML-документа (DOM)[^].
Овации
Энди


Sergey Alexandrovich Kryukov

Я не вижу, как это может решить проблему OP, где требуется вмешательство XML-сериализации. Пожалуйста, ознакомьтесь с нашими комментариями к этому вопросу. Мой ответ состоял в том, чтобы отказаться от этой плохой идеи; и я не могу предложить ничего взамен; я, вероятно, мог бы сделать это, если бы знал больше об общей картине (написание некоторых других файлов/потоков параллельно, что угодно). В прошлом я уже сталкивался с расплывчатыми "требованиями" поддерживать некоторые информационные расширения к данным в комментариях и отказывался это делать. Есть такие вещи, не делать их важнее, чем любые особенности...
—СА

Andreas Gieriet

Я понимаю вашу точку зрения. Но я не такая строгая, как ты. ОП нашел другое решение, которое решает его проблему, даже я считаю это взломом, если у него есть вся цепочка под его контролем.
Овации
Энди

Sergey Alexandrovich Kryukov

Речь идет не только о строгости. Мое первое замечание было таково: я не вижу, как ваше решение может помочь. OP использует не автономную генерацию XML, а сериализацию, где вы непосредственно не управляете выводом XML. Вы понимаете, в чем дело?
—СА

Andreas Gieriet

Смотрите мое предложение: "Если вы хотите написать **произвольный** XML-код". Мне не ясно, является ли использование ОП встроенной поддержки сериализации адекватным для его проблемы. Вот почему я пишу: "если вы хотите написать **произвольный** XML-код...". мы, кажется, читаем и интерпретируем этот вопрос по-другому... ;-)
Овации
Энди

Sergey Alexandrovich Kryukov

Я думаю, что OP нуждается во встроенной поддержке сериализации; и это единственная реальная проблема. Если бы он просто писал какие-то комментарии где-то, это вообще не было бы проблемой.
—СА