Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для awp-sirius
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
.NET 4.x

Сохранение коллекции

20.12.2018, 13:37. Показов 1472. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть задача сохранять коллекцию в файл, но без возможности открыть в текстовом редакторе.

сейчас реализую так:
C#
1
2
3
4
5
using (FileStream ms = new FileStream(saveFileDialog.FileName, FileMode.Create))
{
    DataContractSerializer serializer = new DataContractSerializer(typeof(BindableCollection<InfoModel>));
    serializer.WriteObject(ms, Informations);
}
Но независимо от расширения блокнот открывает и данные можно прочитать.

Есть какой-то способ кроме того как шифровать?
C#
1
2
3
4
5
6
7
8
9
10
                byte[] message = ObjectToByteArray(data);
                byte[] encMessage;
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
                using (var rijndael = new RijndaelManaged())
                {
                    rijndael.Key = pdb.GetBytes(32);
                    rijndael.IV = pdb.GetBytes(16);
                    encMessage = EncryptBytes(rijndael, message);
                }
                File.WriteAllBytes(path, encMessage);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2018, 13:37
Ответы с готовыми решениями:

Сделать сортировку коллекции вместо создания новой коллекции с передачей IOrderedEnumerable<T>
Есть: SortableObservableCollection&lt;T&gt; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using...

Как удалить элемент из коллекции, во время перебора этой коллекции foreach?
Прив. Смотрите что. Есть сервер, на нем 2 класса - Server &amp; ClientConnection. При подключении нового клиента в Server создается новый...

Доступ из элемента коллекции к другим элементам коллекции
Подскажите как получить данные из другого элемента коллекции? В приведенном примере необходимо реализовать метод который бы брал значение...

12
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
20.12.2018, 13:42
используй бинарную сериализацию, файл открыть конечно можно будет, но там нечитаемая информация будет
0
 Аватар для awp-sirius
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
20.12.2018, 14:02  [ТС]
так и хотел, но использую коллекцию от калибурна.
падает ошибка:

System.Runtime.Serialization.Serializati onException: "Тип "Caliburn.Micro.BindableCollection`1[[_______InfoModel, _______, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]" в сборке "Caliburn.Micro, Version=3.2.0.0, Culture=neutral, PublicKeyToken=8e5891231f2ed21f" не помечен как сериализуемый."

[Serializable] ничего не даёт(
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
20.12.2018, 14:12
SeIZVeIZ, да читаемая она будет. да типы конечно не прочитаешь, но значения точно отловить можно))
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
20.12.2018, 14:46
Цитата Сообщение от awp-sirius Посмотреть сообщение
[Serializable] ничего не даёт(
куда именно ставили этот атрибут? как именно используете коллекции? через nuget или исходный код у Вас в приложении этой коллекции?

Добавлено через 44 секунды
Andreyip, а как ты сопоставишь то что найдёшь с реальными данными? откуда они, зачем они, данные ли это?
1
 Аватар для awp-sirius
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
20.12.2018, 14:50  [ТС]
SeIZVeIZ, через nuget.
тут есть ответ: https://stackoverflow.com/ques... -ver-3-0-3

но BinaryFormatter не умеет же [DataContract]

я уже в общем-то сделал при помощи Rfc2898DeriveBytes. Шифрую им, перевожу в байты при помощи DataContractSerializer

но, возможно, есть более красивый способ
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,843
Записей в блоге: 1
20.12.2018, 14:53
awp-sirius, может проще записывать байты которые возвращает метод ObjectToByteArray?
0
 Аватар для awp-sirius
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
20.12.2018, 15:04  [ТС]
в том-то и дело, что если внутри DataContractSerializer, то текстовик читает эти байты
можно, конечно, сохранять как-то по хитрому...
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
20.12.2018, 15:06
awp-sirius, есть ещё такой "велосипед" не знаю на сколько он будет подходить Вам:
C#
1
2
3
4
5
6
7
8
using (FileStream fileStream = new FileStream(fileName, FileMode.Create))
            {
                var record1 = new BindableCollection<string>() {"1", "2", "3"};
                DataContractSerializer serializer = new DataContractSerializer(typeof(BindableCollection<string>));
                XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(fileStream); // создаём бинарный Writer для DataContractSerializer
                serializer.WriteObject(binaryDictionaryWriter, record1);
                binaryDictionaryWriter.Flush();
            }
1
 Аватар для awp-sirius
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
20.12.2018, 15:08  [ТС]
мой класс InfoModel наследуется от PropertyChangedBase. Там есть OnPropertyChanged, которые не сохраняется и после загрузки равен null. Так что придётся всё-таки конвертить в другой класс, который будет специально заточен под сохранение.

Не хотелось так делать, но, видимо, увы.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,843
Записей в блоге: 1
20.12.2018, 15:26
Цитата Сообщение от awp-sirius Посмотреть сообщение
в том-то и дело, что если внутри DataContractSerializer, то текстовик читает эти байты
Если в данных нет ничего секретного, то банальный XOR массива или преобразование в base64 строку будет вполне достаточно. Хотя раз уже сделано шифрование, то нет большого смысла переписывать.
1
 Аватар для awp-sirius
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
20.12.2018, 16:31  [ТС]
В общем, если в дальнейшем будет кому-то интересно, методы ObjectToByteArray и ByteArrayToObject:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private static byte[] ObjectToByteArray(object obj)
{
    if (obj == null) return null;
    BinaryFormatter bf = new BinaryFormatter();
    using (MemoryStream ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}
 
private static object ByteArrayToObject(byte[] arrBytes)
{
    if (arrBytes == null) return null;
    BinaryFormatter bf = new BinaryFormatter();
    using (MemoryStream ms = new MemoryStream())
    {
        ms.Write(arrBytes, 0, arrBytes.Length);
        ms.Seek(0, SeekOrigin.Begin);
        bf.Binder = new MySerializationBinder();
        Object obj = (Object)bf.Deserialize(ms);
        return obj;
    }
}
Методы сохранения, загрузки:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public static void SaveData(this object data, string password, string path)
{
    try
    {
        byte[] message = ObjectToByteArray(data);
        byte[] encMessage;
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
        using (var rijndael = new RijndaelManaged())
        {
            rijndael.Key = pdb.GetBytes(32);
            rijndael.IV = pdb.GetBytes(16);
            encMessage = EncryptBytes(rijndael, message);
        }
        File.WriteAllBytes(path, encMessage);
    }
    catch (Exception) { }
}
 
public static object LoadData(string password, string path)
{
    try
    {
        if (File.Exists(path))
        {
            byte[] message = File.ReadAllBytes(path);
            byte[] decMessage;
 
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
 
            using (var rijndael = new RijndaelManaged())
            {
                rijndael.Key = pdb.GetBytes(32);
                rijndael.IV = pdb.GetBytes(16);
                decMessage = DecryptBytes(rijndael, message);
 
                var data = ByteArrayToObject(decMessage);
                return data;
            }
        }
    }
    catch (Exception) { }
    return null;
}
И что касается шифрования:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
private static byte[] EncryptBytes(SymmetricAlgorithm alg, byte[] message)
{
    if ((message == null) || (message.Length == 0))
    {
        return message;
    }
 
    if (alg == null)
    {
        throw new ArgumentNullException("alg");
    }
 
    using (var stream = new MemoryStream())
    using (var encryptor = alg.CreateEncryptor())
    using (var encrypt = new CryptoStream(stream, encryptor, CryptoStreamMode.Write))
    {
        encrypt.Write(message, 0, message.Length);
        encrypt.FlushFinalBlock();
        return stream.ToArray();
    }
}
 
private static byte[] DecryptBytes(SymmetricAlgorithm alg, byte[] message)
{
    if ((message == null) || (message.Length == 0))
    {
        return message;
    }
 
    if (alg == null)
    {
        throw new ArgumentNullException("alg");
    }
 
    using (var stream = new MemoryStream())
    using (var decryptor = alg.CreateDecryptor())
    using (var encrypt = new CryptoStream(stream, decryptor, CryptoStreamMode.Write))
    {
        encrypt.Write(message, 0, message.Length);
        encrypt.FlushFinalBlock();
        return stream.ToArray();
    }
}
Без шифрования BinaryFormatter отдаёт читаемые строки и стандартные типы данных.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
банальный XOR массива или преобразование в base64 строку будет вполне достаточно
Согласен, будет время - рассмотрю такую реализацию и разницу во времени по сравнению с Rfc2898DeriveBytes)

Добавлено через 53 минуты
шифрование 16 миллисекунд, XOR, ожидаемо, 1
даже не знаю что выбрать)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,843
Записей в блоге: 1
20.12.2018, 16:41
Цитата Сообщение от awp-sirius Посмотреть сообщение
и разницу во времени по сравнению с Rfc2898DeriveBytes)
[Режим зануды ВКЛ]
По сравнению с Rijndael (AES). RFC 2898 это алгоритмы хеширования, а не шифрования.
[Режим зануды ВЫКЛ]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2018, 16:41
Помогаю со студенческими работами здесь

Удаление элемента коллекции в коллекции коллекции )
Есть коллекция (к1), в ней элементы + коллекция (к2), Так вот в к2 тоже есть элементы, и из к2 надо удалить элемент. к1 отображается на...

Сохранение остатка элементов в коллекции по заданному времени
Добрый день, может кто подскажет интересует возможно ли сохранять остаток элементов в коллекции по заданному времени. Имеется коллекция...

Анонимные коллекции в другие коллекции, как?
Здравствуйте. Говорю сразу, я не уверен что есть такой термин как анонимная коллекция. Наверно будет правильно сказать анонимная...

Заменить элементы одной коллекции на элементы другой коллекции
Всем привет, у меня такой вопрос: есть 2 коллекции: List&lt;Person&gt; list1 = new List&lt;Person&gt; { ...

Сохранение списка объектов класса в ручную, сохранение в XML. Без сериализации.
Здравствуйте! Хотел спросить. Как можно сохранить список объектов в XML файл вручную? Я сериализацией делаю так: Класс, который будем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru