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


Автор: megel 7.8.2008, 21:55
Вот мой код, reader это Binary Reader 

 
Код

      public struct Test
        {
            public char n;
            public char b;
            public char c;
            public char a;
        }

        static BinaryReader reader;

        static void Main(string[] args)
        {
            FileStream stream = new FileStream("data.txt", FileMode.Open);
            reader = new BinaryReader(stream);

            Test test;

            test = (Test)Read(typeof(Test));
        }

        public static object Read(Type type)
        {
            int size = Marshal.SizeOf(type);

            byte[] buffer = reader.ReadBytes(size);

            IntPtr ptr = Marshal.AllocHGlobal(size);

            for (int i = 0; i < size; i++)
                Marshal.WriteByte(ptr, i, buffer[i]);

            object temp = Marshal.PtrToStructure(ptr, type);

            Marshal.FreeHGlobal(ptr);

            return temp;
        }


два вопроса - 

можно ли таким образом читать структуры с масивами
ведь нельзя поставить char a[10];
можно токо char[] a = new char[10];

сильно ди будет медленее(или быстрее) читаться структуры по сравнению с чтением каждого параметра по отдельности ???




Автор: mihryak 7.8.2008, 22:45
не силён в маршалинге, но по крайней мере для массивов определённой длины можно задать атрибут MarshalAs
Код

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] // 2 здесь - кол-во символов в массиве
            public char[] b;

про скорость тоже не отвечу, но читать из файла в любом случае стоит блоками

Автор: megel 8.8.2008, 12:28
спасибо.

только не понял -

Цитата

но читать из файла в любом случае стоит блоками


это всмысле читать обычным способом - каждую переменную binary reader'om ?


Автор: mihryak 8.8.2008, 15:59
Цитата(megel @  8.8.2008,  13:28 Найти цитируемый пост)
это всмысле читать обычным способом - каждую переменную binary reader'om ?

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

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