none
Проблема с записью данных структуры в файл WPF RRS feed

  • Общие обсуждения

  • Всем доброго времени суток, столкнулся с проблемой записи данных в бинарный файл, а именно: 

    В предыдущей теме, я научился выделять жестко своей структуре столько памяти сколько нужно, соответственно переработал структуру я ушел от автоматического заполнения свойств, и структура у меня теперь выглядит следующим образом :

    public class test
        {
            private float resm;
            public float Resm
            {
                get { return resm; } 
                set { resm = Convert.ToSingle(Math.Round(value));}
            }
            private float resp;
            public float Resp
            {
                get { return resp; }
                set { resp = Convert.ToSingle(Math.Round(value));}
            }
            
            public float[] result { get; set; }
            public str_pereval pereval { get; set; }
       //     public str_pereval pereval
       //     {
      //          get { return Pereval; }
      //          set { Pereval = value; }
      //      }
       };
    
    
    
        [StructLayout(LayoutKind.Explicit, Size = 104)]
        public class str_pereval                      //Класс данных валков
        {
           [FieldOffset (0)] private int nk;               //{ get; set; } //Номер клети
           [FieldOffset (4)] private int n_lower;          //{ get; set; } //Номер нижнего валка
           [FieldOffset (8)] private int n_top;            //{ get; set; } //Номер верхнего валка
           [FieldOffset (12)] private float d_lower;        //{ get; set; } //Диаметр нижнего валка 
           [FieldOffset (16)] private float d_top;          //{ get; set; } //Диаметр верхнего валка
           [FieldOffset (24)] private double t_n;         //{ get; set; } //Дата\Время перевалки
            //public DateTime t_k;         //{ get; set; }
           [FieldOffset (40)] private float l;             //{ get; set; } //Длина
           [FieldOffset (44)] private float p;              //{ get; set; } //Вес в тоннах
           [FieldOffset (48)] private float pm;             //{ get; set; } //Вес в тоннах при прокате меньше 0.7мм
           [FieldOffset (52)] private float pp;            ///{ get; set; } //Вес в тоннах при прокате больше либо равно 0.7 мм
           [FieldOffset (56)] private float kal_n;          //{ get; set; }
           [FieldOffset (60)] private float kal_v;          //{ get; set; }
           [FieldOffset (64)] private float res_v;          //{ get; set; } //Ресурс валков
    
        public int Nk
      {
            get {return  nk; }
            set { nk = value; }
      }
    
          public int N_lower
      {
          get { return n_lower; }
          set { n_lower = value; } 
      }
          public int N_top
      {
        get { return n_top; }
        set { n_top = value; }
      }
    
          public float D_lower
          {
              get { return d_lower; }
              set { d_lower = value; }
          } 
          
            public float D_top
          {
              get { return d_top; }
              set { d_top = value; }
          }
    
            public float L
            {
                get { return Convert.ToSingle (Math.Round(l/1000.0)); }
                set { l = value; }
            }
            public float P
            {
                get { return Convert.ToSingle(Math.Round(p)); }
                set {p = value;}
            }
    
            public float Pm
            {
                get { return Convert.ToSingle(Math.Round(pm)); }
                set { pm = value; }
            }
            public float Pp
            {
                get { return Convert.ToSingle(Math.Round(pp)); }
                set { pp = value; }
            }
            public float Res_v
            {
                get { float sum; sum = res_v * 100; if (res_v == 1000.0)sum = res_v / 100; return sum; }
                set { res_v = value; }
            }
            public DateTime T_n
            {
                get { return DateTime.FromOADate(t_n); }
            }
        };

    С чтением данного файла вообще проблем не наблюдаю, но когда я пытаюсь сохранить свои данные при изменении, получаю исключения следующего формата :

    Невозможно упаковать тип "WpfApplication1.test" как неуправляемую структуру; невозможно вычислить размер или смещение, имеющие смысл.

     private void CommandBinding_Save_Executed(object sender, ExecutedRoutedEventArgs e)
            {
                using (var writer = new BinaryWriter(File.Open("fpereval.dat", FileMode.Create)))
                {
                    foreach (var obj in List)
                        WriteStruct(writer, obj);
    }
     }
    
     void WriteStruct<T>(BinaryWriter Writer, T value) where T : class, new()
            {
                int rawsize = Marshal.SizeOf(typeof(T));
                IntPtr buffer = Marshal.AllocHGlobal(rawsize);
                Marshal.StructureToPtr(value, buffer, false);
                byte[] rawdatas = new byte[rawsize];
                Marshal.Copy(buffer, rawdatas, 0, rawsize);
                Marshal.FreeHGlobal(buffer);
                Writer.Write(rawdatas);
            }
    Исключения ловлю сразу же в первой строке int rawsize = Marshal.SizeOf(typeof(T));  Поведение программы, виснет на сек 2-3 а затем вылетает с исключением. С чем связано такое поведение и как бороться с данной проблемой ? Если можно пример. Если нужно больше данных могу предоставить. Всем большое спасибо. 


    17 декабря 2015 г. 7:11