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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как записать структуру в файл не используя сериали 
:(
    Опции темы
Igoreck
Дата 28.7.2008, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 28.9.2007

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



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

  
Пусть у нас есть упрощенная структура с одной переменной:

Код

public struct TEMPER 
    {
    public int tempr_air;      // температура воздуха

                 }


Я решил попробывать записать через  байтовый массив. Пришлось создать функию с использованием "небезопасного"  (unsafe)  кода - иначе не работала функция определения размера структуры : 


       
Код

 unsafe int write1()
        {
            int w;
            w = sizeof(TEMPER);
            TEMPER temp1 = new TEMPER();
            Random fixRand = new Random();
            temp1.tempr_air = (fixRand.Next()) % 11 + 391;
            Stream stream1 = new FileStream("E:\\temperature.bin", FileMode.Append, FileAccess.Write, FileShare.None);
            stream1.Write((????????, 0, w);  // вместо вопросов в качестве параметров в эту функцию надо передать массив byte[], в который надо    //преобразовать мою структуру
            stream1.Close();   
        }


можно ли преобразовать структуру в массив переменных типа byte?   Если можно - то как. Или есть какое-нибудь более красивое решение моего вопроса

PM MAIL   Вверх
Partizan
Дата 28.7.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



Igoreck, а вы какую сериализацию использовали?
BinaryFormatter ом не пробовали?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Igoreck
Дата 29.7.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 28.9.2007

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



to Partizan  "BinaryFormatter ом не пробовали?"  - вот им как раз и пробывал))  - все записалось- только к 50 байтам полезной информации добавилось почти целый Кб служебной ((
PM MAIL   Вверх
Partizan
Дата 29.7.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



ну вообще тут могут пригодиться функции Marshal.StructureToPtr и Marshal.PtrToStruct


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Igoreck
Дата 30.7.2008, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 28.9.2007

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



to Partizan  - большое спасибо за совет - эт то что надо)))) - вроде все получилось :

функция преобразования из файла в структуру:

 
Код

{
            TEMPER temp2 = new TEMPER();
            byte[] buf1 = new byte[Marshal.SizeOf(temp2)];
            IntPtr tp = Marshal.AllocHGlobal(Marshal.SizeOf(temp2));
            try
            {
                Stream stream1 = new FileStream("E:\\temperature.bin", FileMode.Open, FileAccess.Read, FileShare.None);
                stream1.Seek((Marshal.SizeOf(temp2))*4, SeekOrigin.Begin);
                stream1.Read(buf1, 0, buf1.Length);
                Marshal.Copy(buf1, 0, tp, buf1.Length);
                temp2 = (TEMPER)Marshal.PtrToStructure(tp, typeof(TEMPER));
                this.label1.Text = (temp2.tempr_air).ToString();  
                stream1.Close();

            }
            finally
            {
                Marshal.FreeHGlobal(tp);
            }

        }



и наоборот -  из структуры в байтовый массив и записи в файл :

Код

{
            TEMPER temp1 = new TEMPER();
            byte[] buf = new byte[Marshal.SizeOf(temp1)];
            IntPtr tp = Marshal.AllocHGlobal(Marshal.SizeOf(temp1));
            try
            {
                Random fixRand = new Random();
                temp1.tempr_air = (short)((fixRand.Next()) % 11 + 391);
                Marshal.StructureToPtr(temp1, tp, false);
                Marshal.Copy(tp, buf, 0, buf.Length);
                Stream stream1 = new FileStream("E:\\temperature.bin", FileMode.Append, FileAccess.Write, FileShare.None);
                stream1.Write(buf, 0, buf.Length);
                stream1.Close();
            }
            finally
            {
                Marshal.FreeHGlobal(tp);
            }
}



и что особо радует - удалось избежать использования unsafe кода ))

Это сообщение отредактировал(а) Igoreck - 30.7.2008, 21:47
PM MAIL   Вверх
PashaPash
Дата 30.7.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



Igoreck, может лучше в сторону баз данных посмотри? Код будет даже меньше, чем для записи в файл. И не придется изобретать велосипед.


--------------------
PM MAIL WWW   Вверх
Igoreck
Дата 30.7.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 28.9.2007

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



to  PashaPash - с базами данных я работал только на фоксе - давно и мало  - а с файлами   - много и на С++ . На шарпе правда еще ни с тем ни другим не работал - но решил, что с файлами мне будет проще разобраться - хотя может я еще и поменяю точку зрения в процессе работы))
PM MAIL   Вверх
Partizan
Дата 30.7.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



а какой смысл в базе данных, если всего-то и надо что сериализовать парочку объектов?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PashaPash
Дата 30.7.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



Цитата(Partizan @  30.7.2008,  21:36 Найти цитируемый пост)
а какой смысл в базе данных, если всего-то и надо что сериализовать парочку объектов? 

вообще-то задача, насколько я понял - запись показаний датчика температуры. куча одинаковых записей, по записи в пару секунд, в течении долгого времени - это совсем не "парочка объектов". Это пару десятков тысяч записей в сутки. Очень интересно будет посмотреть как по этой "парочке сериализованных объектов" будут строить статистику за месяц.
Igoreck, все зависит от объема данных и от того, как их потом собираешься использовать.


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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