Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2013, 11:01   #1
Death Watch
Новичок
Джуниор
 
Аватар для Death Watch
 
Регистрация: 08.06.2013
Сообщений: 2
По умолчанию Неправильная дисериализация

Доброго всем времени суток. Недавно столкнулся такой проблемой, и никак не могу ее решить. Гугль тоже ничего толкового по этой теме не выдает.
А суть вот в чем:
Имеется класс, для бинарной сериализации:

Код:
[Serializable]
    class scf
    {
        public string[] name;
        public long[] length;
        public byte[,] bytemas;
    }
Имеется кнопка для сериализации множества файлов из выбранной папки в единый бинарный файл:

Код:
int colfiles = listBox1.Items.Count; //список файлов в выбранной папке
            progressBar1.Maximum = colfiles;
            progressBar1.Value = 0;
            scf packer = new scf();
            packer.name = new string[colfiles];
            packer.length = new long[colfiles];
            FileStream fs = new FileStream("packed.bpk", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
            BinaryFormatter bf = new BinaryFormatter();
            for (int i = 0; i < colfiles; i++)
            {
                FileInfo fi = new FileInfo(listBox1.Items[i].ToString());
                packer.name[i] = fi.Name;
                packer.length[i] = fi.Length;
                byte[] buffer = new byte[packer.length[i]];
                packer.bytemas = new byte[colfiles, buffer.Length];
                buffer = File.ReadAllBytes(listBox1.Items[i].ToString());
                for (int j = 0; j < buffer.Length; j++)
                {
                    packer.bytemas[i, j] = buffer[j];
                }
                progressBar1.Value = i+1;
            }

            bf.Serialize(fs, packer);
            fs.Close();
            fs.Dispose();
            MessageBox.Show("Файл packed.bpk успешно собран");
        }
И вторая кнопка, соответственно - дисериализации:
Код:
try
            {
            textBox1.Clear();
                scf unpack = new scf();
                FileStream fs = new FileStream("packed.bpk", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                BinaryFormatter bf = new BinaryFormatter();
                unpack = (scf)bf.Deserialize(fs);
                fs.Close();
                fs.Dispose();
                int colfiles = unpack.name.Count();
                progressBar1.Maximum = colfiles;
                progressBar1.Value = 0;
                if (!Directory.Exists("unpacked"))
                {
                    Directory.CreateDirectory("unpacked");
                }
                for (int i = 0; i < colfiles; i++)
                {
                    long size = unpack.length[i];
                    textBox1.AppendText(" \n");
                    textBox1.AppendText(unpack.name[i]+" : "+Convert.ToString(size)+"\n");
                    byte[] buffer = new byte[size];
                    for (int j = 0; j < size; j++)
                    {
                        buffer[j] = unpack.bytemas[i, j];
                        textBox1.AppendText(Convert.ToString(unpack.bytemas[i, j])+" ");
                    }
                    Array.Clear(buffer, 0, buffer.Length);
                    File.WriteAllBytes("unpacked/" + unpack.name[i], buffer);
                    progressBar1.Value = i + 1;

                }

                MessageBox.Show("Распаковка успешно завершена");
            }
            catch {
               MessageBox.Show("Ошибка, файл packed.bpk не найден");
            }
Так вот - сериализация проходит успешно. Файл создается.
А вот с дисериализацией ничего не выходит - "распаковка" происходит, файлы создаются в папке unpacked. Но, только последний из "распакованных" файлов получается корректным. остальные содержат только null-ы.

В чем проблема? помогите пожалуйста.
Death Watch вне форума Ответить с цитированием
Старый 27.06.2013, 17:55   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Array.Clear(buffer, 0, buffer.Length);
File.WriteAllBytes("unpacked/" + unpack.name[i], buffer);
Т.е. сначала мы буфер очищаем, потом пишем его (очищенный!) в файл, и удивляемся наличию в файле сплошных нуллов?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 27.06.2013, 19:34   #3
Death Watch
Новичок
Джуниор
 
Аватар для Death Watch
 
Регистрация: 08.06.2013
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Т.е. сначала мы буфер очищаем, потом пишем его (очищенный!) в файл, и удивляемся наличию в файле сплошных нуллов?
Ой, я не правильный код скинул этой строчки там быть не должно ) (это я сам напортачил, во время попыток исправить баг)

В той ошибке что я описывал, только последний файл записывался корректно, а все остальные null.

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

Код:
packer.bytemas = new byte[colfiles, buffer.Length];
я каждый шаг основного цикла, заново генерировал bytemas поэтому кроме последней записи, все предыдущие были пустыми.
Ошибку исправил, все работает.

Luuzuk, спасибо что откликнулись
Death Watch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
неправильная работа keybd_event chertovich Win Api 3 07.01.2012 14:52
неправильная параллельная конфигурация Gigoga Помощь студентам 0 21.04.2011 00:02
Неправильная запись в бд erwerwe SQL, базы данных 1 12.04.2011 01:00
Неправильная авторизация на сайте? grafgrial Работа с сетью в Delphi 16 10.12.2010 22:56
Неправильная ссылка на скачивание nickki О форуме и сайтах клуба 2 01.04.2007 12:10