1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zhuovi-XiaoFeng.Core

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

XiaoFeng.Core

fayelf

GitHub top language GitHub License Nuget Downloads Nuget Nuget (with prereleases)

Nuget: XiaoFeng.Core

QQ群号 QQ群 Публичный аккаунт
748408911 QQ 群 畅聊了个科技

Исходный код: https://github.com/zhuovi/xiaofeng.core

Руководство: https://www.eelf.cn

Общая библиотека C# для базовых операций, включающая JSON, XML, операции с базами данных ADO.NET (SQLSERVER, MYSQL, ORACLE, DAMENG, SQLITE, ACCESS, OLEDB, ODBC и др.), регулярные выражения, QueryableX (ORM) и EF, сетевые журналы, расписание, операции с файлами, алгоритмы шифрования (AES, DES, DES3, MD5, RSA, RC4, SHA и др.), удобный менеджер конфигураций, пулы приложений, преобразование типов и другие функции.

XiaoFeng.Core

Создание XiaoFeng.Core с использованием XiaoFeng.Core.

Установка

.NET CLI

$ dotnet add package XiaoFeng.Core --version تلفزيون

Package Manager

PM> Install-Package XiaoFeng.Core --Version 2.3.6

PackageReference

<PackageReference Include="XiaoFeng.Core" Version="2.3.6" />

Paket CLI

> paket add XiaoFeng.Core --version 2.3.6

Script & Interactive

> #r "nuget: XiaoFeng.Core, 2.3.6"

Cake

// Установка XiaoFeng.Core как Cake Addin
#addin nuget:?package=XiaoFeng.Core&version=2.3.6
```// Установка XiaoFeng.Core как Cake Tool
#tool nuget:?package=XiaoFeng.Core&version=2.3.6

Обновления

2023-11-17 v 2.3.6

  1. Добавлен метод IsDefined для проверки наличия определенного атрибута в перечислении;

  2. Исправлен баг в Redis, связанный с неправильным возвратом состояния при публикации;

  3. Улучшена работа с Cookies в HttpHelper.

2023-10-27 v 2.3.5

Задача (Job)

  1. Добавлен метод отмены задания в настройках задания, добавлен метод отмены задания при запуске;

  2. Улучшена работа событий IJob;

XiaoFeng.ParameterCollection (Параметры)

  1. В ParameterCollection добавлен метод ToJson;

XiaoFeng.Http (Библиотека HTTP)

  1. В HttpHelper добавлен метод DownFileAsync в классе HttpRequest;

XiaoFeng.PrototypeHelper (Расширенные методы)

  1. Улучшен метод For;

  2. Добавлен расширенный метод Object.ToStringX();

  3. Улучшен расширенный метод GetValue для преобразования строк в объекты;

Регулярные выражения

  1. Улучшены регулярные выражения для URL и FTP, добавлено распознавание кириллицы;

XiaoFeng.Json (JSON)

  1. Улучшен метод StringObjectConverter для преобразования объектов в строки;

XiaoFeng.Threading (Многопоточность)

  1. Настройка максимального количества сообщений задания в логе;

  2. Улучшена работа планировщика заданий, разделены одноразовые и периодические задания для повышения производительности, уменьшено количество записей в логе для экономии памяти;

  3. Обновлены очереди задач для многопоточного выполнения, улучшена работа событий отмены заданий;### XiaoFeng.Log (Логирование)

  4. Обновлены логи, добавлены решения для проблем с ростом памяти при высокой конкуренции, очистка очереди при превышении 65535 элементов;

29.08.2023 v 2.3.4

  1. Улучшена работа Redis для решения проблемы бесконечного ожидания;

  2. Улучшена работа подключения Redis;

  3. Улучшен ParameterCollection;

22.08.2023 v 2.3.3

  1. Улучшена работа HttpSocket для HTTPS в HttpHelper;

  2. В настройках XiaoFeng добавлен уровень логирования для событий планировщика, по умолчанию Warn;

  3. Добавлен класс ParameterCollection для обработки сортировки и объединения параметров;

  4. Изменен уровень логирования для JobScheduler;

  5. Добавлен метод для преобразования перечислений в строки с учетом регистра;

  6. В классе ParameterCollection добавлен метод GetBytes с различными конструкторами для настройки URL-кодирования и кодировки строк;

  7. Добавлены расширенные методы RSAEncryption для подписи и проверки хэшей;

  8. Исправлены ошибки при сериализации пустых перечислений в JSON и XML;

  9. Улучшена работа при закрытии Redis;## 03.08.2023 v 2.3.01. Удалите переходное пространство имен XiaoFeng.Model.Core;

  10. Оптимизировать создание таблиц данных на основе моделей;

  11. Добавить индексное свойство TableIndexAttribute;

  12. Добавить индексное свойство модели; добавить получение индексного свойства модели;

  13. Добавить проверку наличия таблицы в базе данных;

  14. Исправить ошибку при получении описания перечисления GetDescription при отсутствии текущего перечисления;

  15. Добавить возможность пошагового установления параметров в интерфейсе расписания IJob;

  16. Установить интерфейс задачи IJobWorker;

  17. Добавить методы GetBytes и GetText() для FayFile;

  18. Добавить поддержку паттернов конфигурации в ConfigSet, позволяющую одному конфигурационному моделированию соответствовать нескольким файлам конфигурации;

  19. Обновить время очистки пула потоков до 10 минут;

  20. Исправить отсутствие метода Split(char) в NETSTANDARD 2.0;

  21. Исправить формат date_format в MySQL;

  22. Исправить HttpRequest, заменив ClientCertificates на ClientCertificates;## 2023-05-16 v 2.2.21. Оптимизация DataHelperX;

  23. Оптимизация преобразования байта в SByte;

  24. Оптимизация отображения пустых полей в ResponseMessage;

  25. Исправление ошибок регулярных выражений для проверки номера паспорта и JSON;

  26. Добавление опции ToJson для игнорирования определенных узлов;

  27. Добавление опции ToJson для сериализации узлов в строку при значении длинного целого больше 9007199254740992;

  28. Исправление отображения нуля в фронтенде при сериализации длинного целого больше 9007199254740992 в JSON;---

Библиотека XiaoFeng содержит следующие компоненты

Пространство имен Библиотека Статус открытого исходного кода Описание Включенные функции
XiaoFeng. Prototype XiaoFeng. Core :white_check_mark: Расширение библиотеки ToCase преобразование типов
ToTimestamp, ToTimestamps преобразование времени в отметки времени
GetBasePath получение абсолютного пути файла, поддерживает Linux, Windows
GetFileName получение имени файла
GetMatch, GetMatches, GetMatchs, IsMatch, ReplacePattern, RemovePattern операции с регулярными выражениями
XiaoFeng. Net XiaoFeng. Net :white_check_mark: Библиотека для работы с сетью XiaoFeng библиотека для работы с сетью, содержит клиент и сервер для сокетов (Socket, WebSocket), позволяет легко реализовать подписку и публикацию и другие функции.
XiaoFeng. Http XiaoFeng. Core :white_check_mark: Библиотека для имитации HTTP-запросов Имитация HTTP-запросов
XiaoFeng. Data XiaoFeng. Core :white_check_mark: Библиотека для работы с базами данных Поддерживает SQLSERVER, MYSQL, ORACLE, DAMENG, SQLITE, ACCESS, OLEDB, ODBC и другие десятки баз данных
XiaoFeng. Cache XiaoFeng. Core :white_check_mark: Библиотека кэширования Кэширование в памяти, Redis, MemcachedCache, MemoryCache, FileCache
XiaoFeng. Config XiaoFeng. Core :white_check_mark: Библиотека для работы с конфигурационными файлами Создание модели для автоматического создания конфигурационных файлов, поддерживает форматы XML, JSON, INI
XiaoFeng. Cryptography XiaoFeng. Core :white_check_mark: Библиотека шифрования AES, DES, RSA, MD5, DES3, SHA, HMAC, RC4 шифры
XiaoFeng. Excel XiaoFeng.Excel :white_check_mark: Библиотека для работы с Excel Работа с Excel, создание, редактирование, чтение содержимого, границы, шрифты, стили и другие функции
XiaoFeng. Ftp XiaoFeng. Ftp :white_check_mark: Библиотека для работы с FTP FTP клиент
XiaoFeng. IO XiaoFeng. Core :white_check_mark: Библиотека для работы с файлами Чтение и запись файлов
XiaoFeng. Json XiaoFeng. Core :white_check_mark: Библиотека сериализации и десериализации JSON Сериализация и десериализация JSON
XiaoFeng. Xml XiaoFeng. Core :white_check_mark: Библиотека сериализации и десериализации XML Сериализация и десериализация XML
XiaoFeng. Log XiaoFeng. Core :white_check_mark: Библиотека для записи логов Запись логов в файл, базу данных
XiaoFeng. Memcached XiaoFeng. Memcached :white_check_mark: Библиотека кэширования Memcached Memcached middleware, поддерживает .NET, .NET Core и .NET Standard, удобный клиентский инструмент. Реализует Set, Add, Replace, Prepend, Append, Cas, Get, Gets, Gat, Gats, Delete, Touch, Stats, Stats Items, Stats Slabs, Stats Sizes, Flush_All, Increment, Decrement и другие функции пула потоков.
XiaoFeng. Redis XiaoFeng.Redis :white_check_mark: Библиотека кэширования Redis Redis-клиент, поддерживающий .NET Framework, .NET Core и .NET Standard, удобный инструмент для работы. Поддерживает хэши, ключи, строки, множества, потоки, логи, списки, публикацию/подписку, пулы потоков и другие функции.
XiaoFeng. Threading XiaoFeng. Core :white_check_mark: Библиотека потоков Потоковые задачи, потоковые очереди
XiaoFeng. Mvc XiaoFeng. Mvc :x: Низкокодовый WEB-фреймворк Базовые классы .NET
XiaoFeng. Proxy XiaoFeng. Proxy :white_check_mark: Библиотека прокси В разработке
XiaoFeng. TDengine XiaoFeng. TDengine :white_check_mark: Клиентская библиотека TDengine В разработке
XiaoFeng. GB28181 XiaoFeng. GB28181 :white_check_mark: Библиотека для видеонаблюдения, SIP-библиотека, протокол GB28181 В разработке
XiaoFeng. Onvif XiaoFeng. Onvif :white_check_mark: Библиотека для видеонаблюдения, протокол Onvif XiaoFeng. Onvif использует .NET для обертки стандартных интерфейсов, устройств, медиа и управления камерами с использованием C#. Отказ от использования WCF для генерации wsdl-файлов и вместо этого использование XML для обертки параметров, контроль всех данных.
FayElf. Plugins. WeChat FayElf. Plugins. WeChat :white_check_mark: Библиотека для WeChat-аккаунтов и мини-приложений Библиотека для WeChat-аккаунтов и мини-приложений.

Текущий метод позволяет преобразовать любое значение, включая объектные и массивные типы. Перед преобразованием значения проверяется, совпадает ли текущий тип с типом, в который нужно преобразовать. Если типы не совпадают, проверяется, соответствует ли значение формату целевого типа. Если значение не соответствует формату, оно преобразуется в значение по умолчанию для целевого типа. Также можно задать значение по умолчанию.

Примеры преобразования типов данных:

  • Преобразование строки в целое число
  • Преобразование строки в дату
  • Преобразование строки в UUID

Примеры использования:

using XiaoFeng;

int a = "10".ToCast<int>();
long b = "10".ToCast<long>();
double c = "10".ToCast<double>();
DateTime d = "2022-01-19".ToCast<DateTime>();
float e = "".ToCast<float>(1.0);
int f = (int)"".GetValue(typeof(int));
Guid g = "58AFBEB5791311ECBF49FA163E542B11".ToCast<Guid>();
Guid h = "58AFBEB5-7913-11EC-BF49-FA163E542B11".ToCast<Guid>();

Также есть ряд методов, специализирующихся на преобразовании строк в различные типы данных, например:

Int16 a = "1".ToInt16();
int b = "2".ToInt32();
Int64 c = "3".ToInt64();
UInt16 d = "4".ToUInt16();
UInt32 e = "5".ToUInt32();
UInt64 f = "6".ToUInt64();
float e = "7.2".ToFloat();
DateTime g = "2022-01-19 12:32".ToDateTime();
double h = "6.3".ToDouble();
byte i = "2".ToByte();
Boolean j = "1".ToBoolean();
Boolean k = "true".ToBoolean();
Boolean l = "False".ToBoolean();
Decimal m = "3.658".ToDecimal();
long n = "2584512".ToLong();
Guid o = "58AFBEB5791311ECBF49FA163E542B11".ToGuid();
Guid p = "58AFBEB5-7913-11EC-BF49-FA163E542B11".ToGuid();
```## Получение базового типа объекта GetValueType

### Примеры использования:
```csharp
var a = "a".GetValueType();
var b = 10.GetValueType();
var c = new { a = "a", b = "b" }.GetValueType();
var d = new Dictionary<string, string>().GetValueType();

Возвращаемое значение представляет собой перечисление типов ValueTypes```csharp ///

/// Значения типов /// public enum ValueTypes { /// /// Пусто /// [Description("Пусто")] Null = 0, /// /// Значение /// [Description("Значение")] Value = 1, /// /// Класс /// [Description("Класс")] Class = 2, /// /// Структура /// [Description("Структура")] Struct = 3, /// /// Перечисление /// [Description("Перечисление")] Enum = 4, /// /// Строка /// [Description("Строка")] String = 5, /// /// Массив /// [Description("Массив")] Array = 6, /// /// List /// [Description("List")] List = 7, /// /// Словарь /// [Description("Словарь")] Dictionary = 8, /// /// ArrayList /// [Description("ArrayList")] ArrayList = 9, /// /// Является ли коллекцией /// [Description("Является ли коллекцией")] IEnumerable = 10, /// /// Словарь /// [Description("Словарь")] IDictionary = 11, /// /// Анонимный тип /// [Description("Анонимный тип")] Anonymous = 12, /// /// DataTable /// [Description("DataTable")] DataTable = 13, /// /// Другое /// [Description("Другое")] Other = 20 }


Метод IsMatch является расширением, который проверяет, соответствует ли текущая строка заданному регулярному выражению. Например, проверяет, является ли текущая строка номером QQ. Пример кода:
```csharp
if ("7092734".IsMatch(@"^\d{5-11}$"))
    Console.WriteLine("Это номер QQ.");
else
    Console.WriteLine("Это не номер QQ.");

Результат выполнения: Это номер QQ. Так как строка "7092734" действительно является номером QQ.

Метод IsNotMatch работает аналогично методу IsMatch, но отрицательно проверяет соответствие строки регулярному выражению.

Метод Match возвращает первый найденный соответствующий элемент, используя заданное регулярное выражение и опции поиска.

Метод Matches возвращает все найденные соответствия, используя заданное регулярное выражение и опции поиска.

Эти три метода являются базовыми и другими расширениями используются на их основе.

Метод GetMatch возвращает первый найденный элемент, соответствующий заданному шаблону.

Метод GetPatterns возвращает все найденные элементы, соответствующие заданному шаблону.

Метод GetMatchs возвращает все группы данных, соответствующие первому найденному элементу.

Метод GetMatches возвращает все группы данных, соответствующие всем найденным элементам.

Количество извлекаемых данных: GetMatch < GetMatchs < GetPatterns < GetMatches

Метод ReplacePattern используется для замены данных с использованием регулярного выражения.Примеры использования этих методов:

var a = "abc4d5e6hh5654".GetMatch(@"\d+");
a равно: "4";
var b = "abc4d5e6hh5654".GetPatterns(@"\d+");
b равно: ["4", "5", "6", "5654"];
var c = "abc4d5e6hh5654".GetMatchs(@"(?<a>[a-z]+)(?<b>\d+)");
c равно: {{"a", "abc"}, {"b", "4"}};
var d = "abc4d5e6hh5654".GetMatches(@"(?<a>[a-z]+)(?<b>\d+)");
d равно: [{{"a", "abc"}, {"b", "4"}}, {{"a", "d"}, {"b", "5"}}, {{"a", "e"}, {"b", "6"}}, {{"a", "hh"}, {"b", "5654"}}]
var g = "a6b9c53".ReplacePattern(@"\d+", "g");
g равно: "agbgcg";
var h = "a6b7c56".RemovePattern(@"\d+");
h равно: "abc";
var i = "a1b2c3".ReplacePattern(@"\d+", m => {
   var a = m.Groups["a"].Value;
    if(a == "1") return "a1";
    else return "a2";
});
i равно: "aa1ba2ca2";
```## Преобразование чисел в прописные цифры ToChineseNumber и ToNumber

### Примеры использования

```csharp
var a = "123456789.1234";
// Преобразование в прописные цифры
var b = a.ToChineseNumber();
// Результат: Сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять целых одна тысяча двести тридцать четыре десятых
// Преобразование в прописные цифры для денежных единиц
var c = a.ToChineseNumber(UpperType.Money);
// Результат: Сто двадцать три миллиона четыреста пятьдесят шесть тысяч семьсот восемьдесят девять рублей одна тысяча двести тридцать четыре копейки
// Преобразование прописных цифр в числа
var d = c.ToNumber();
// Результат: 123456789.1234
// Преобразование прописных цифр в числа с добавлением формата
var e = c.ToNumber(true);
// Результат: 123 456 789.1234
// Преобразование чисел в числа с добавлением формата
var f = "123456789.1235684".ToNumber(true);
// Результат: 123 456 789.1235684
```# Управление конфигурациями XiaoFeng.Config.ConfigSet<>

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

## Примеры использования

Класс XiaoFeng автоматически создает конфигурационный файл XiaoFeng.json. Исходный код библиотеки классов представлен ниже.```csharp
     /// <summary>
     /// Общая конфигурация XiaoFeng
     /// </summary>
     [ConfigFile("Config/XiaoFeng.json", 0, "FAYELF-CONFIG-XIAOFENG", ConfigFormat.Json)]
     public class Setting : ConfigSet<Setting>, ISetting
     {
         #region Конструкторы
         /// <summary>
         /// Базовый конструктор
         /// </summary>
         public Setting() : base() { }
         /// <summary>
         /// Конструктор с указанием имени файла конфигурации
         /// </summary>
         /// <param name="fileName"></param>
         public Setting(string fileName) : base(fileName) { }
         #endregion
         
         #region Свойства
          /// <summary>
          /// Включить отладку
          /// </summary>
          [Description("Включить отладку")]
          public bool Debug { get; set; } = true;
          /// <summary>
          /// Максимальное количество потоков
          /// </summary>
          [Description("Максимальное количество потоков")]
          public int MaxWorkerThreads { get; set; } = 100;
          /// <summary>
          /// Время простоя при потреблении логов
          /// </summary>
          [Description("Время простоя при потреблении логов")]
          public int IdleSeconds { get; set; } = 60;
          /// <summary>
          /// Время ожидания выполнения задачи в очереди
          /// </summary>
          private int _TaskWaitTimeout = 5 * 60;
          /// <summary>
          /// Время ожидания выполнения задачи в очереди
          /// </summary>
          [Description("Время ожидания выполнения задачи в очереди")]
          public int TaskWaitTimeout {
              get
              {
                  if (this._TaskWaitTimeout == 0)
                      this._TaskWaitTimeout = 10 * 1000;
                  return this._TaskWaitTimeout;
              }
              set
              {
                  this._TaskWaitTimeout = value;
              }
          }
          /// <summary>
          /// Включить шифрование данных
          /// </summary>
```         [Description("Enable data encryption")]
          public bool DataEncrypt { get; set; } = false;
          /// <summary>
          /// Data encryption key
          /// </summary>
          [Description("Data encryption key")]
          public string DataKey { get; set; } = "7092734";
          /// <summary>
          /// Enable request logging
          /// </summary>
          [Description("Enable request logging")]
          public bool ServerLogging { get; set; }
          /// <summary>
          /// Enable interception
          /// </summary>
          [Description("Enable interception")]
          public bool IsIntercept { get; set; }
          /// <summary>
          /// SQL injection string
          /// </summary>
          [Description("SQL injection string")]
          public string SQLInjection { get; set; } = @"insert\s+into |update |delete |select | union | join |exec |execute | exists|'|truncate |create |drop |alter |column |table |dbo\.  |sys\.  |alert\(|<scr|ipt>|<script|confirm\(|console\.  |\.  js|<\/\s*script>|now\(\)|getdate\(\)|time\(\)| Directory\.  | File\.  |FileStream |\.  Write\(|\.  Connect\(|<\?  php|show tables |echo | outfile |Request[\.  \(]|Response[\.  ```markdown
```json
{
    "Debug"/*enable debugging*/: true,
    "MaxWorkerThreads"/*maximum number of worker threads*/: 100,
    "IdleSeconds"/*idle time before logging*/: 60,
    "TaskWaitTimeout"/*task wait timeout*/: 300,
    "DataEncrypt"/*enable data encryption*/: false,
    "DataKey"/*data encryption key*/: "7092734",
    "ServerLogging"/*enable request logging*/: false,
    "IsIntercept"/*enable interception*/: false,
    "SQLInjection"/*SQL injection string*/: "insert\\s+into |update |delete |select | union | join |exec |execute | exists|'|truncate |create |drop |alter |column |table |dbo\\.  |sys\\.  |alert\\(|<scr|ipt>|<script|confirm\\(|console\\.  |\\.  js|<\\/\\s*script>|now\\(\\)|getdate\\(\\)|time\\(\\)| Directory\\.  | File\\.  |FileStream |\\.  Write\\(|\\.  Connect\\(|<\\?  php|show tables |echo | outfile |Request[\.  \(]|Response[\.  ``````markdown
php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。 DescriptionAttribute текущий атрибут является атрибутом комментария конфигурационного файла

php|show tables |echo | outfile |Request[\\.  \\(]|Response[\\.  \\(]|eval\\s*\\(|\\$_GET|\\$_POST|cast\\(|Server\\.  CreateObject|VBScript\\.  Encode|replace\\(|location|\\-\\-"
 }

ConfigFileAttribute текущие атрибуты主要用于定义当前配置的存储路径、存储格式(JSON、XML)、缓存KEY、缓存时长,文件更改后会自动更新缓存。

```csharp
var set = XiaoFeng.Config.Setting.Current;
// Чтение данных узла
var debug = set.Debug;
// Установка данных узла
set.Debug = false;
// Сохранение текущей конфигурации методом Save обновляет содержимое в конфигурационном файле
set.Save();

XiaoFeng.Http.HttpHelper библиотека для сетевых запросов

HttpHelper — это библиотека для имитации HTTP-запросов. Предоставляет три ядра: HttpClient, HttpWebRequest, HttpSocket По умолчанию используется ядро HttpClient

Использование

  • GET запрос
var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest
{
    Method = HttpMethod.Get, // Не задано, по умолчанию GET
    HttpCore = HttpCore.HttpClient, // Не задано, по умолчанию HttpClient
    Address = "http://www.fayelf.com"
});
if (result.StatusCode == System.Net.HttpStatusCode.OK)
{
    /* Запрос успешен */
    // Содержимое ответа
    var value = result.Html;
    // Байтовое содержимое ответа
    var bytes = result.Data;
}
else
{
    /* Запрос не успешен */
}
  • POST запрос с формой
var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest
{
    Method = HttpMethod.Post,
    Address = "http://www.fayelf.com",
    Data = new Dictionary<string, string>
    {
        {"account", "jacky" },
        {"password", "123456" }
    }
});
if (result.StatusCode == System.Net.HttpStatusCode.OK)
{
    /* Запрос успешен */
    // Содержимое ответа
    var value = result.Html;
    // Байтовое содержимое ответа
    var bytes = result.Data;
}
else
{
    /* Запрос не успешен */
}
  • POST запрос с теломcsharp var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest { Method = HttpMethod.Post, ContentType = "application/json", Address = "http://www.fayelf.com", BodyData = @"{""account"":""jacky"",""password"":""123456""}" }); if (result.StatusCode == System.Net.HttpStatusCode.OK) { /* Запрос успешен */ // Содержимое ответа var value = result.Html; // Байтовое содержимое ответа var bytes = result.Data; } else { /* Запрос не успешен */ } * POST запрос с FORMDATA, то есть запрос, содержащий как данные формы, так и потоки файлов```csharp var result = await XiaoFeng.Http.HttpHelper.GetHtmlAsync(new XiaoFeng.Http.HttpRequest { Method = HttpMethod.Post, ContentType = "application/x-www-form-urlencoded", Address = "http://www.fayelf.com", FormData = new List<XiaoFeng.Http.FormData> { new XiaoFeng.Http.FormData { Name="account", Value="jacky", FormType= XiaoFeng.Http.FormType.Text }, new XiaoFeng.Http.FormData { Name="password", Value="123456", FormType= XiaoFeng.Http.FormType.Text }, new XiaoFeng.Http.FormData { Name="headimage", Value=@"E://Work/headimage.png", FormType= XiaoFeng.Http.FormType.File } } }); if (result.StatusCode == System.Net.HttpStatusCode.OK) { /Запрос выполнен успешно/ //Ответное содержимое var value = result.Html; //Байтовое содержимое ответа var bytes = result.Data; } else { /Запрос не выполнен успешно/ }

* Скачать файл

``` csharp

await XiaoFeng.Http.HttpHelper.Instance.DownFileAsync(new XiaoFeng.Http.HttpRequest
{
    Method = HttpMethod.Get,
    Address = "http://www.fayelf.com/test.rar"
}, @"E:/Work/test.rar");

```

# Операции с базой данных DataHelper

* XiaoFeng.Data.DataHelper, текущий класс поддерживает SQLSERVER, MYSQL, ORACLE, DAMENG, SQLITE, ACCESS, OLEDB, ODBC и десятки других типов баз данных.

## Пояснения по использованию

Простой пример

```csharp
var data = new XiaoFeng.Data.DataHelper(new XiaoFeng.Data.ConnectionConfig
{
    ProviderType= XiaoFeng.Data.DbProviderType.SqlServer,
    ConnectionString= "server=.;uid=testuser;pwd=123;database=Fay_TestDb;"
});
var dt = data.ExecuteDataTable("select * from F_Tb_Account;");
```
1. Прямое выполнение SQL-запроса```csharp
var non1 = data.ExecuteNonQuery("insert into F_Tb_Account(Account,Password) values('jacky','admin');");
```
Значение non1, если non1 равно -1, означает, что выполнение запроса завершилось ошибкой, и можно получить последнюю ошибку через data.ErrorMessage.
Если non1 больше или равно 0, это означает количество выполненных строк SQL-запроса.2. Возврат DataTable

```csharp
var dt = data.ExecuteDataTable("select * from F_Tb_Account;");
```
dt это объект DataTable.

3. Возврат первого столбца первой строки

```csharp
var val1 = data.ExecuteScalar("select Account from F_Tb_Account;");
```
Тип val1 объект, в зависимости от значений базы данных можно использовать пользовательские преобразования, например: var val2 = (int)val1; также можно использовать расширения XiaoFeng, например: var val2 = val1.ToCast<int>();

4. Возврат объекта DataReader

```csharp
var dataReader = data.ExecuteReader("select * from F_Tb_Account;");
```
dataReader это объект DataReader.

5. Возврат объекта DataSet

```csharp
var dataSet = data.ExecuteDataSet("select * from F_Tb_Account;select * from F_Tb_Account;");
```
dataSet это объект DataSet.

6. Выполнение хранимых процедур

```csharp
var data = data.ExecuteDataTable("proc_name", System.Data.CommandType.StoredProcedure, new System.Data.Common.DbParameter[]
{
    data.MakeParam(@"Account","jacky")
});
```

7. SQL-запрос с параметрами

```csharp
var data2 = data.ExecuteDataTable("select * from F_Tb_Account where Account=@Account;", new System.Data.Common.DbParameter[]
{
    data.MakeParam(@"@Account","jacky")
});
```

8. Прямое преобразование в объект

```csharp
var models = data.QueryList<Account>("select * from F_Tb_Account");
var model = data.Query<Account>("select * from F_Tb_Account");
```

# XiaoFeng.Threading.JobScheduler Задачи планирования

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

Класс задачи: XiaoFeng.Threading.Job

Основной класс планирования: XiaoFeng.Threading.JobScheduler## Пояснение по использованию

1. Выполнение задачи один раз через определенное время

```csharp
var job = new XiaoFeng.Threading.Job
{
    Async = true,
    Name = "Название задачи",
    TimerType = XiaoFeng.Threading.TimerType.Once,
    StartTime = DateTime.Now.AddMinutes(5),
    SuccessCallBack = job =>
    {
        /*Выполнение задачи по истечению времени*/
    }
};
job.Start();
```
Текущая задача будет выполнена через 5 минут, затем уничтожена и удалена из планировщика.

2. Периодическое выполнение задачи

```csharp
var job = new XiaoFeng.Threading.Job
{
    Async = true,
    Name = "Название задачи",
    TimerType = XiaoFeng.Threading.TimerType.Interval,
    Period = 5000,
    StartTime = DateTime.Now.AddMinutes(5),
    SuccessCallBack = job =>
    {
        /*Выполнение задачи по истечению времени*/
    }
};
job.Start();
```
Текущая задача будет запущена через 5 минут, затем выполнена каждые 5000 миллисекунд (5 минут).

3. Ежедневное выполнение задачи

```csharp
var job = new XiaoFeng.Threading.Job
{
    Async = true,
    Name = "Название задачи",
    TimerType = XiaoFeng.Threading.TimerType.Day,
    Times = new List<Times> { new Times(2, 0, 0), new Times(4, 0, 0) },
    StartTime = DateTime.Now.AddMinutes(5),
    SuccessCallBack = job =>
    {
        /*Выполнение задачи по истечению времени*/
    }
};
```
Текущая задача будет запущена через 5 минут, затем выполнена каждый день в 2:00 и 4:00.

4. Выполнение задачи в определенные дни недели и месяца

```csharp
var job = new XiaoFeng.Threading.Job
{
    Async = true,
    Name = "Название задачи",
    TimerType = XiaoFeng.Threading.TimerType.Week,
    Times = new List<Times> { new Times(10, 12, 13, week: 1), new Times(11, 12, 13, week: 1) },
    StartTime = DateTime.Now.AddMinutes(5),
    SuccessCallBack = job =>
    {
        /*Выполнение задачи по истечению времени*/
    }
};
job.Start();
```Текущая задача будет запущена через 5 минут, затем выполнена каждый понедельник в 10:12:13 и 11:12:13.
# XiaoFeng.Xml XML сериализация

Сериализация XML — это преобразование объекта данных в XML-формат, а десериализация — преобразование XML-данных обратно в объект данных.
Пространство имен: XiaoFeng.Xml
Сначала рассмотрим конфигурацию сериализации```csharp
/// <summary>
/// Настройки сериализации
/// </summary>
public class XmlSerializerSetting
{
    #region Конструкторы
    /// <summary>
    /// Безаргументный конструктор
    /// </summary>
    public XmlSerializerSetting()
    {    }
     #endregion
 ```    
    #region Свойства
     /// <summary>
     /// Формат Guid
     /// </summary>
     public string GuidFormat { get; set; } = "D";
     /// <summary>
     /// Формат даты
     /// </summary>
     public string DateTimeFormat { get; set; } = "yyyy-MM-dd HH:mm:ss.fff";
     /// <summary>
     /// Включено форматирование
     /// </summary>
     public bool Indented { get; set; } = true;
     /// <summary>
     /// Значение типа перечисления
     /// </summary>
     public EnumValueType EnumValueType { get; set; } = 0;
     /// <summary>
     /// Максимальная глубина
     /// </summary>
     public int MaxDepth { get; set; } = 28;
     /// <summary>
     /// Пропускание комментариев
     /// </summary>
     public bool OmitComment { get; set; } = true;
     /// <summary>
     /// Игнорирование регистра ключей
     /// </summary>
     public bool IgnoreCase { get; set; } = false;
     /// <summary>
     /// Значение по умолчанию для корневого узла
     /// </summary>
     public string DefaultRootName { get; set; } = "Root";
     /// <summary>
     /// Значение по умолчанию для кодировки
     /// </summary>
     public Encoding DefaultEncoding { get; set; } = Encoding.UTF8;
     /// <summary>
     /// Получает или задает значение, указывающее, следует ли System.Xml.XmlWriter удалять повторяющиеся объявления пространств имен при записи XML-содержимого. Значение по умолчанию — вывод всех объявленных пространств имен в пространстве имен разрешения писателя.
     /// </summary>
     public NamespaceHandling NamespaceHandling { get; set; }
     /// <summary>
     /// Пропускание объявления XML
     /// </summary>
     public bool OmitXmlDeclaration { get; set; } = false;
     /// <summary>
     /// Получает или задает строку, используемую для символа новой строки. Строка, используемая для символа новой строки. Она может быть установлена как любой строковый значением.
     /// </summary>
Однако, чтобы гарантировать, что XML является валидным, следует использовать только допустимые пробелы, такие как пробел, табуляция, возврат каретки или новая строка. Значение по умолчанию — \r\n (возврат каретки, новая строка).
     /// </summary>
     public string NewLineChars { get; set; } = Environment.NewLine;
     /// <summary>
     /// Пропуск имени узла для элементов массива, где ключ не указан
     /// </summary>
     public Boolean OmitArrayItemName { get; set; } = true;
     /// <summary>
     /// Пропуск пустых узлов
     /// </summary>
     public Boolean OmitEmptyNode { get; set; } = true;
     /// <summary>
     /// Пропуск пространств имен
     /// </summary>
     public Boolean OmitNamespace { get; set; } = true;
     #endregion
 }Простое использование, расширены два метода EntityToXml(), XmlToEntity();Сначала рассмотрим XML-модель объекта

```csharp
/// <summary>
/// Описание класса XmlModel
/// </summary>
[XmlRoot("Root")]
public class XmlModel
{
    #region Конструкторы
    /// <summary>
    /// Базовый конструктор
    /// </summary>
    public XmlModel()
    {

    }
    #endregion

    #region Свойства
    /// <summary>
    /// Свойство 1
    /// </summary>
    [XmlCData]
    [XmlElement("NameA")]
    public string FieldName1 { get; set; }
    /// <summary>
    /// Свойство 2
    /// </summary>
    [XmlConverter(typeof(XiaoFeng.Xml.StringEnumConverter))]
    [XmlElement("NameB")]
    public EnumValueType FieldName2 { get; set; }
    /// <summary>
    /// Свойство 3
    /// </summary>
    [XmlConverter(typeof(XiaoFeng.Xml.DescriptionConverter))]
    [XmlElement("Namec")]
    public EnumValueType FieldName3 { get; set; }
    /// <summary>
    /// Свойство 4
    /// </summary>
    public string FieldName4 { get; set; }
    #endregion

    #region Методы

    #endregion
}
```
Простое использование

```csharp
var a = new XmlModel
{
    FieldName1 = "Value1",
    FieldName2 = EnumValueType.Name,
    FieldName3 = EnumValueType.Value,
    FieldName4 = "Value4"
}.EntityToXml();
//XmlSerializer.Serializer(a) и a.EntityToXml() одинаковы
```
//Результат
```xml
<?xml version="1.0" encoding="utf-8"?>
<Root>
  <NameA><![CDATA[Value1]]></NameA>
  <NameB>Name</NameB>
  <Namec>значение</Namec>
  <FieldName4>Value4</FieldName4>
</Root>
var b = a.XmlToEntity<XmlModel>();
//XmlSerializer.Deserialize<XmlModel>(a) и XmlToEntity<XmlModel>() одинаковы
```
Далее рассмотрим несколько особенностей сериализации```csharp
// Ignoring properties
XmlIgnoreAttribute
// Specifying node name
XmlElementPath
// Type conversion
XmlConverterAttribute
// Enum conversion
StringEnumConverter
// Description conversion
DescriptionConverter
```
Далее приведем пример использования `XmlElementPath`. Текущее свойство поддерживает только десериализацию, сериализация пока не поддерживается. Предположим, что у нас есть такой XML:

```xml
<root>
    <node name="example" />
</root>
``````xml
<?xml version="1.0" encoding="utf-8"?>
<Root>
  <NameA>
    <NameD><![CDATA[Value1]]></NameD>
    <NameC>bbb</NameC>
  </NameA>
  <NameB>Name</NameB>
  <Namec>значение</Namec>
  <FieldName4>Value4</FieldName4>
</Root>
```
По общим правилам определения модели, подузел A и B должны быть определены в отдельном классе. 
На самом деле, можно определить следующим образом:
```csharp
/// <summary>
/// Описание класса XmlModel
/// </summary>
[XmlRoot("Root")]
public class XmlModel
{
    #region Конструкторы
    /// <summary>
    /// Конструктор без параметров
    /// </summary>
    public XmlModel()
    {

    }
    #endregion

    #region Свойства
    /// <summary>
    /// Свойство 1
    /// </summary>
    [XmlCData]
    [XmlElementPath("NameA/NameC")]
    public string A { get; set; }
    /// <summary>
    /// Свойство 2
    /// </summary>
    [XmlCData]
    [XmlElementPath("NameA/NameD")]
    public string B { get; set; }
    /// <summary>
    /// Свойство 3
    /// </summary>
    [XmlConverter(typeof(XiaoFeng.Xml.StringEnumConverter))]
    [XmlElement("NameB")]
    public EnumValueType FieldName2 { get; set; }
    /// <summary>
    /// Свойство 4
    /// </summary>
    [XmlConverter(typeof(XiaoFeng.Xml.DescriptionConverter))]
    [XmlElement("Namec")]
    public EnumValueType FieldName3 { get; set; }
    /// <summary>
    /// Свойство 5
    /// </summary>
    public string FieldName4 { get; set; }
    #endregion

    #region Методы

    #endregion
}
```
Результат десериализации:
```csharp
// Результат десериализации
```Если данные можно извлечь напрямую из дочерних узлов и десериализовать в объект, без необходимости определения отдельного подмодели.
Если не требуется определение модели, в XiaoFeng.Xml предоставляется универсальный объект модели XmlValue.
XML-сериализация и десериализация были рассмотрены, для практического применения необходимо самостоятельно выполнить соответствующие действия.# XiaoFeng.Json JSON сериализация

JSON сериализация — это процесс преобразования объекта данных в JSON данные, а также преобразование JSON данных обратно в объект данных.
Пространство имен: XiaoFeng.Json
Метод сериализации: JsonParser.SerializeObject, также можно использовать расширение метода ToJson()
Метод десериализации: JsonParser.JsonParser.DeserializeObject<T>(), также можно использовать расширение метода JsonToObject()
Пример использования, смотрите код

```csharp
// Сериализация
var a = new {
        key1 = "value1",
        key2 = "value2"
    }.ToJson();
// Значение a: {"key1":"value1","key2":"value2"}
// Десериализация
var b = @"{""key1"":""value1"",""key2"":""value2""}.JsonToObject();
// Значение b: словарь в формате JSON

```
В приведенном выше примере используется анонимный объект, при десериализации, поскольку тип не указан, он автоматически преобразуется в объект типа JsonValue;
Далее подробное описание конфигурации сериализации, при использовании расширений Tojson, JsonToObject можно указать параметры конфигурации. Параметры конфигурации следующие:
``````csharp
/// <summary>
/// Настройки сериализации JSON
/// </summary>
public class JsonSerializerSetting
{
    #region Конструкторы
    /// <summary>
    /// Базовый конструктор
    /// </summary>
    public JsonSerializerSetting() { }
    #endregion    #region Свойства
    /// <summary>
    /// Формат GUID
    /// </summary>
    public string GuidFormat { get; set; } = "D";
    /// <summary>
    /// Формат даты и времени
    /// </summary>
    public string DateTimeFormat { get; set; } = "yyyy-MM-dd HH:mm:ss.fff";
    /// <summary>
    /// Флаг форматирования
    /// </summary>
    public bool Indented { get; set; } = false;
    /// <summary>
    /// Тип значения перечисления
    /// </summary>
    public EnumValueType EnumValueType { get; set; } = 0;
    /// <summary>
    /// Максимальная глубина разбора
    /// </summary>
    public int MaxDepth { get; set; } = 28;
    /// <summary>
    /// Флаг записи комментариев
    /// </summary>
    public bool IsComment { get; set; } = false;
    /// <summary>
    /// Флаг игнорирования регистра ключей
    /// </summary>
    public bool IgnoreCase { get; set; } = false;
    /// <summary>
    /// Флаг игнорирования пустых узлов
    /// </summary>
    public bool OmitEmptyNode { get; set; } = false;
    #endregion
}
```
Далее рассмотрим несколько характеристик при сериализации.```csharp
// Игнорирование значений свойств
JsonIgnoreAttribute
// Указание имени узла
JsonElement
// Конвертация типов
JsonConverterAttribute
// Конвертер перечислений
StringEnumConverter
// Конвертер описаний
DescriptionConverter
```

Далее рассмотрим примеры; ниже приведен определенный JSON-модель

```csharp
/// <summary>
/// Описание класса JsonModel
/// </summary>
public class JsonModel
{
    #region Конструкторы
    /// <summary>
    /// Базовый конструктор
    /// </summary>
    public JsonModel()
    {

    }
    #endregion

    #region Свойства
    /// <summary>
    /// Свойство 1
    /// </summary>
    [JsonElement("NameA")]
    public string FieldName1 { get; set; }
    /// <summary>
    /// Свойство 2
    /// </summary>
    [JsonConverter(typeof(XiaoFeng.Json.DescriptionConverter))]
    [JsonElement("NameB")]
    public EnumValueType FieldName2 { get; set; }
    /// <summary>
    /// Свойство 3
    /// </summary>
    [JsonConverter(typeof(XiaoFeng.Json.StringEnumConverter))]
    [JsonElement("NameC")]
    public EnumValueType FieldName3 { get; set; }
    /// <summary>
    /// Свойство 4
    /// </summary>
    [JsonElement("NameD")]
    public EnumValueType FieldName4 { get; set; }
    #endregion
```    #region Методы
```    #endregion
}
//При использовании
var a = new JsonModel
{
    FieldName1 = "aaaa",
    FieldName2 = EnumValueType.Name,
    FieldName3 = EnumValueType.Value,
    FieldName4 = EnumValueType.Value
}.ToJson();
//Текущий JSON-формат: {"NameA":"aaaa","NameB":"имя","NameC":"Значение","NameD":0}
//Потому что FieldName1 был установлен как NameA, FieldName2 был установлен как NameB, FieldName3 был установлен как NameC, а FieldName4 не был установлен
//Два значения перечисления различаются, потому что второе значение было установлено для чтения содержимого Description, то есть значение атрибута DescriptionAttribute для EnumValueType.Name
//Третье значение берется из Value, потому что используется конвертер StringEnumConverter, поэтому значение сразу преобразуется в имя. Если конвертер не установлен, то будет выведен соответствующий номер
//При десериализации также соответствует этому формату в модели объектаJson-сериализация и десериализация были описаны. Для более подробного понимания необходимо самостоятельно выполнить практические операции.


# Об авторе


* Сайт: http://www.fayelf.com
* QQ: 7092734
* E-Mail: jacky@fayelf.com

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

C# общая библиотека, включающая сетевую библиотеку, JSON, XML, ADO.NET для работы с базами данных, поддержку регулярных выражений, QueryableX (ORM) и интеграцию с Entity Framework, сетевые журналы, планирование, операции ввода-вывода, шифрование, пулы приложений, преобразование типов и другие функции. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/zhuovi-XiaoFeng.Core.git
git@api.gitlife.ru:oschina-mirror/zhuovi-XiaoFeng.Core.git
oschina-mirror
zhuovi-XiaoFeng.Core
zhuovi-XiaoFeng.Core
main