Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Десериализация структуры


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

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

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

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

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

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

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

ну да, в структуре у меня три поля, но потом в этот файл я запихиваю еще данные так же бинарной запиью...

Автор: Heinzz 9.12.2009, 22:25
а Вы из точно полностью убираете перед десериализацией?

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

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

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

Автор: Heinzz 9.12.2009, 22:49
Перед сериализацией стандартными методами надо лишнее из файла убрать.
структура Ваша занимает под 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();

Автор: PaZ1T1V 10.12.2009, 06:42

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

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

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

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

Автор: PaZ1T1V 10.12.2009, 10:47
спасибо большое за помошь, все так как вы сказали сделал, все работает, тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)