Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Десериализация структуры, помогите 
V
    Опции темы
PaZ1T1V
Дата 9.12.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 26.2.2008
Где: Багдад )

Репутация: нет
Всего: нет



Доброго времени суток, в общем вопрос в следующем:
имеется структура
Код

public struct FILEHEADER
{
    public int size;
    public short type;
    public int bits;
}

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

 public string LoadFile(string path)
        {
            string error = "";
            FileStream streamReadFile = File.OpenRead(@path);
            try
            {               
                BinaryFormatter frmBinary = new BinaryFormatter();             
                FileHeader = (FILEHEADER)frmBinary.Deserialize(streamReadFile);//SerializationException
            }
            catch (IOException ex)
            {
                error = ex.Message;
            }
            finally
            {
                streamReadFile.Close();
            }
            return error;
        }

после этого кода приложение выкидывает экзепшн с текстом The input stream is not a valid binary format. The starting contents (in bytes) are: 42-4D-36-B4-04-00-00-00-00-00-76-00-00-00-28-00-00 ...

эмммм....
пишу вот такую строчку для десериализации, точнее хочу удостовериться в том что он что то считал 
Код

                string str = frmBinary.Deserialize(streamReadFile).ToString();

, но все равно компилятор выкидывает тот же SerializationException

что это, точнее нет, почему это так происходит ? 
            
Помогите пожалуйста решить данную проблему!
советы типа "читай побайтно" не годятся...
с уважением.


Это сообщение отредактировал(а) PaZ1T1V - 9.12.2009, 21:57
--------------------
[size=8]Atention please!!![/size]
[size=6]Кривые руки[/size]
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Heinzz
Дата 9.12.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Цитата(PaZ1T1V @  9.12.2009,  21:48 Найти цитируемый пост)
в общем файл состоит из этой структурки сначала и еще кучи байт...

откуда куча байт берется, у Вас же только три поля в структуре?


--------------------
user posted image
PM MAIL   Вверх
PaZ1T1V
Дата 9.12.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 26.2.2008
Где: Багдад )

Репутация: нет
Всего: нет



Цитата(Heinzz @ 10.12.2009,  01:13)
Цитата(PaZ1T1V @  9.12.2009,  21:48 Найти цитируемый пост)
в общем файл состоит из этой структурки сначала и еще кучи байт...

откуда куча байт берется, у Вас же только три поля в структуре?

ну да, в структуре у меня три поля, но потом в этот файл я запихиваю еще данные так же бинарной запиью...
--------------------
[size=8]Atention please!!![/size]
[size=6]Кривые руки[/size]
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Heinzz
Дата 9.12.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



а Вы из точно полностью убираете перед десериализацией?

Добавлено через 4 минуты и 39 секунд
Не правильно это  в файл сериализации дописывать. Если эти данные что Вы дописали неразрывно связаны с сериализуемым объектом, то необходимо писать свой сериализатор для класса который учтет Ваше желание записать что-то еще. smile 


--------------------
user posted image
PM MAIL   Вверх
PaZ1T1V
Дата 9.12.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 26.2.2008
Где: Багдад )

Репутация: нет
Всего: нет



Цитата(Heinzz @ 10.12.2009,  01:25)
а Вы из точно полностью убираете перед десериализацией?

извините, не понял вопроса....
в общем, файл состоит из байтов, где первые 10 байт это моя структура, затем идет что то остальное, не важно что, какие то данные, вот, мне надо бы сразу вытащить эти первые 10 байт и пихнуть их в структуру, то есть сделать как в сях fread(FileHeader,1,1,sizeof(FILEHEADER)); только под дотнет и на C#, мне сказали так возможно сдеалть только при помощи Desirialize,вот... я и пытаюсь это сделать, но что то не выходит, спросил совета/помощи на форуме....

Это сообщение отредактировал(а) PaZ1T1V - 9.12.2009, 22:35
--------------------
[size=8]Atention please!!![/size]
[size=6]Кривые руки[/size]
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Heinzz
Дата 9.12.2009, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Перед сериализацией стандартными методами надо лишнее из файла убрать.
структура Ваша занимает под 200Байт, совсем не 10.

Добавлено через 12 минут и 41 секунду
Мне кажется это Вам подойдет, BinaryReader/BinaryWriter - файлы компактные, дописывайте что угодно, главное не забыть последовательность.

Код

 FILEHEADER f = new FILEHEADER();
            f.size = 5;
            f.type = 3;
            f.bits = 45;

            FileStream fs = new FileStream(@"E:\TEMP\fs.dat",FileMode.Create);
            BinaryWriter bwr = new BinaryWriter(fs);
            bwr.Write(f.size);
            bwr.Write(f.type);
            bwr.Write(f.bits);

            byte[] data = new byte[5] { 1, 2, 3, 8, 4 };
            bwr.Write(data, 0, 5);
            bwr.Close(); fs.Close();


            FileStream fstr = new FileStream(@"E:\TEMP\fs.dat", FileMode.Open);
            BinaryReader br = new BinaryReader(fstr);

            FILEHEADER fh = new FILEHEADER();
            fh.size = br.ReadInt32();
            fh.type = br.ReadInt16();
            fh.bits = br.ReadInt32();
            byte[] datas = new byte[5];
            br.Read(datas, 0, 5);
            br.Close(); fstr.Close();



--------------------
user posted image
PM MAIL   Вверх
PaZ1T1V
Дата 10.12.2009, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 26.2.2008
Где: Багдад )

Репутация: нет
Всего: нет




а почему 200 байт??? два инта размерностью по 4 байта каждый да шорт который весит 2 байта итого 10 или я не прав ???объясните..

большое спасибо за помощ...

Это сообщение отредактировал(а) PaZ1T1V - 10.12.2009, 06:44
--------------------
[size=8]Atention please!!![/size]
[size=6]Кривые руки[/size]
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Heinzz
Дата 10.12.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



там есть еще и такая информация а это 137 символов ASCII по байту, вот и выходит:
Код
 
яяяя           KConsoleApplication23, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   ConsoleApplication23.FILEHEADER   sizetypebits          - .....  

так что можно сделать свой метод ReadFILEHEADER который через BinaryReader читает Вашу структуру, которая в таком раскладе и займет 10Байт smile 
ну и для записи конечно тоже..
  


--------------------
user posted image
PM MAIL   Вверх
PaZ1T1V
Дата 10.12.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 26.2.2008
Где: Багдад )

Репутация: нет
Всего: нет



спасибо большое за помошь, все так как вы сказали сделал, все работает, тема закрыта.
--------------------
[size=8]Atention please!!![/size]
[size=6]Кривые руки[/size]
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0961 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.