Esempio n. 1
0
        /// <summary>
        /// Создаёт потокобезопасную очередь объектов из текстового файла. Десериализация проводится построчно.
        /// </summary>
        /// <param name="filePath">Путь до файла</param>
        /// <param name="ui">Потокобезопасный интерфейс, нужен для ведения лога в случае ошибки десериализации</param>
        /// <param name="includeComments">Если true, то строки с комментариями тоже будут включены в выборку для десериалиализации.</param>
        /// <param name="trim">Очищать начало и конец строк от отступов и пробелов.</param>
        /// <returns>Возвращает новую потокобезопасную очередь объектов</returns>
        public static LockedQueue <T> QueueFromFile <T>(string filePath, ThreadSafeUI ui = null,
                                                        bool includeComments             = false, bool trim = true)
            where T : IStringSerializeable, new()
        {
            var result = new LockedQueue <T>();

            ReadAndDeserialize(result, filePath, ui, includeComments, trim);
            return(result);
        }
Esempio n. 2
0
 /// <inheritdoc cref="ListFromFile{T}"/>
 /// <summary>
 /// Асинхронно создаёт потокобезопасный список объектов из текстового файла. Десериализация проводится построчно.
 /// </summary>
 public static async Task <LockedList <T> > ListFromFileAsync <T>(string filePath, ThreadSafeUI ui = null,
                                                                  bool includeComments             = false, bool trim = true)
     where T : IStringSerializeable, new()
 {
     return(await Task.Run(() => ListFromFile <T>(filePath, ui, includeComments, trim)));
 }
Esempio n. 3
0
 private static void ReadAndDeserialize <T>(LockedCollection <T> collection, string filePath, ThreadSafeUI ui,
                                            bool includeComments, bool trim)
     where T : IStringSerializeable, new()
 {
     ReadFileLineByLine(filePath, includeComments, trim, (lineNumber, line) => {
         // Десериализуем объект из строки
         var item = new T();
         if (item.DeserializeFromString(line))
         {
             collection.AppendItem(item);
         }
         else
         {
             ui?.Log($"Skipped {typeof(T).Name} because invalid format. Line #{lineNumber}: {line}");
         }
     });
 }
Esempio n. 4
0
 private static void ReadAndDeserialize <T>(IProducerConsumerCollection <T> collection, string filePath, ThreadSafeUI ui,
                                            bool includeComments, bool trim)
     where T : IStringSerializeable, new()
 {
     ReadFileLineByLine(filePath, includeComments, trim, (lineNumber, line) => {
         // Десериализуем объект из строки
         var item = new T();
         if (item.DeserializeFromString(line))
         {
             if (!collection.TryAdd(item))
             {
                 throw new IOException("Unable to ReadAndAppend to ConcurrentCollection.");
             }
         }
         else
         {
             ui?.Log($"Пропускаю, неверная запись объекта {typeof(T).Name}. Строка #{lineNumber}: {line}");
         }
     });
 }