Как сериализовать тип регулярного выражения с помощью сериализации .NET XML

#c# #.net #xml #regex

#c# #.net #xml #регулярное выражение

Вопрос:

Как я могу сериализовать строку из XML в свойство класса типа Regex ?

Вот элементы в XML-файле:

   <IncludeRegex><![CDATA[#include\s*\"\s*(?<FileName>. \\*\.*. )\s*\"]]></IncludeRegex>
  <IncludeDefineRegex><![CDATA[#defines*[A-Za-z_0-9] s*""s*(?<FileName>. .[a-zA-Z0-9] )s*""]]></IncludeDefineRegex>
  

В моем классе, который я сериализую, у меня есть эти свойства:

 public Regex IncludeRegex { get; set; }
public Regex IncludeDefineRegex { get; set; }
  

Остальная часть класса сериализуется без проблем, но Regex свойства не сериализуются. Одним из вариантов является использование альтернативных свойств:

 public string IncludeRegex { get; set; }
public string IncludeDefineRegex { get; set; }
[XmlIgnore]
public Regex IncludeRegexActual { get; private set; }

[XmlIgnore]
public Regex IncludeDefineRegexActual { get; private set; }
  

И задайте эти свойства в установщиках IncludeRegex и IncludeDefineRegex или в функции инициализации. Это работает, но могу ли я сделать это без повторяющихся свойств?

Комментарии:

1. Какую часть регулярного выражения вы хотите сериализовать, кроме шаблона?

Ответ №1:

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

Ответ №2:

Проблема в том, что регулярное выражение не может быть сериализовано. Это можно решить путем реализации IXmlSerializable . Поскольку вы не можете изменить Regex класс, вам придется обрабатывать его в другом классе. Возможно, вы сможете сделать что-то подобное (непроверенное, из моей головы):

 public class MyRegEx : Regex, IXmlSerializable {...}
  

Теперь вам нужно реализовать интерфейс и использовать этот класс вместо регулярного выражения.

Комментарии:

1. Я полагаю, вы имеете в виду IXmlSerializable