/// <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); }
/// <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))); }
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}"); } }); }
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}"); } }); }