Ошибки при сериализации - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет есть такая проблема, пытаюсь сериализовать объекты, но вылезает ошибка. объект:
    [Serializable]
    public abstract class ISetting
    {
        [DisplayName("Имя вкладки")]
        public string Name { get; set; }
 
        public abstract Type GetType();
    }
 
    [Serializable]
    public class Common : ISetting
    {
        [DisplayName("Имя вкладки")]
        public string Name { get; set; }
 
        [DisplayName("Ручное управуление")]
        public bool Manual { get; set; }
 
        [DisplayName("Время ожидания между вкл/выкл коннекторов")]
        public TimeProperty TimeProperty { get; set; }
 
        public Common()
        {
        }
 
        public Common(string name, TimeProperty timeProperty)
        {
            Name = name;
            TimeProperty = timeProperty;
        }
        
        public override Type GetType()
        {
            return typeof (Common);
        }
 
    }
 
    [Serializable]
    public class FirstTest : ISetting
    {
        public string Name { get; set; }
        public int NumberLoads { get; set; }
 
        public TimeProperty[] TimeProperty { get; set; }
 
        public FirstTest(string name, int number, params TimeProperty[] property)
        {
            Name = name;
            NumberLoads = number;
            TimeProperty = property;
        }
        
        public override Type GetType()
        {
            return typeof(FirstTest);
        }
    }
метод сериализации:
public class FileWRHelper
    {
        public static void WriteCongif(List<ISetting> list)
        {
            try
            {
                BinaryFormatter formatter = new BinaryFormatter();
                
                using (FileStream fs = new FileStream("config.tfc", FileMode.OpenOrCreate))
                {
                    formatter.Serialize(fs, list);
                }
            }
            catch (SerializationException ex)
            {
                
            }
 
        }
 
        public static List<ISetting> ReadConfig()
        {
            List<ISetting> list = new List<ISetting>();
            try
            {
 
                BinaryFormatter formatter = new BinaryFormatter();
                using (FileStream fs = new FileStream("config.tfc", FileMode.OpenOrCreate))
                {
                    list = (List<ISetting>)formatter.Deserialize(fs);
                }
            }
            catch (SerializationException ex)
            {
                //list = null;
            }
            return list;
        }
    }
вот такая вот ошибка вылазиет
Тип "FieldTest.Builder.CommonBuilder`1+<>c__DisplayClass1_0[[FieldTest.Builder.Factory.ISetting, FieldTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]" в сборке "FieldTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" не помечен как сериализуемый.
думал ошибка связанна с билдером, но наврядли, и на всякий случай поставил атрибут сериализации
[Serializable]
    public abstract class SettingBuilder<T> : ContentControl where T : ISetting
    {
        public delegate void SettingBuilderHadler(bool state);
 
        public event SettingBuilderHadler Changed;
 
        public ISetting Builder { get; set; }
        public Type Type { get; protected set; }
        public abstract Panel GetControl();
        protected Panel Panel { get; set; }
        protected Load NumLoads { get; set; }
 
        public bool IsCahnge
        {
            get
            {
                return _isChange;
            }
            set
            {
                _isChange = value;
                Changed(IsCahnge);
            }
        }
 
        protected bool _isChange = false;
        protected void InitPanel()
        {
            Panel = new StackPanel();
            Panel.HorizontalAlignment = HorizontalAlignment.Left;
            Panel.VerticalAlignment = VerticalAlignment.Top;
            Panel.FlowDirection = FlowDirection.LeftToRight;
        }
 
        protected void InitLoads()
        {
            NumLoads = new Load();
            NumLoads.HorizontalAlignment = HorizontalAlignment.Left;
        }
    }
    [Serializable]
    public class CommonBuilder<T> : SettingBuilder<T> where T: ISetting
    {
 
        public CommonBuilder(T type)
        {
            Builder = (ISetting)type;
        }
 
        public override Panel GetControl()
        {
            InitPanel();
 
            CheckBox manual = new CheckBox();
            manual.IsChecked = ((Common)Builder).Manual;
            manual.Content = "Ручное управление";
            manual.Checked += (args, e) => { ((Common)Builder).Manual = (bool)manual.IsChecked; };
 
            Time time = new Time(((Common)Builder).TimeProperty);
            time.TimeProperty.Changed += (i, tp) => { ((Common)Builder).TimeProperty = time.TimeProperty;
                                                        IsCahnge = true;
            };
 
            Panel.Children.Add(manual);
            Panel.Children.Add(time);
            
            return Panel;
        }
    }
    [Serializable]
    public class FirstTestBuilder<T> : SettingBuilder<T> where T : ISetting
    {
        public FirstTestBuilder(T type)
        {
            InitPanel();
            InitLoads();
            Panel.Children.Add(NumLoads);
            NumLoads.comboBox.SelectionChanged += (args, e) =>
            {
                ((FirstTest) Builder).NumberLoads = NumLoads.NumLoads;
            };
            Builder = (ISetting) type;
            for (int i = 0; i < ((FirstTest) Builder).TimeProperty.Length; i++)
            {
                Time time = new Time(((FirstTest)Builder).TimeProperty[i]);
                //time.TimeProperty.Changed += () => { ((FirstTest)Builder).TimeProperty[i] = time.TimeProperty; };
                time.TimeProperty.Changed += TimeProperty_Changed;
                time.TimeProperty.Index = i;
                Panel.Children.Add(time);
            }

            this.Content = Panel;
        }
 
        private void TimeProperty_Changed(int i, TimeProperty tp)
        {
            IsCahnge = true;
            ((FirstTest) Builder).TimeProperty[i] = tp;
        }
 
        public override Panel GetControl()
        {
            return Panel;
        }
    }
эта бинарная сериализация, при xml сериализации выдает другую ошибку

Решение задачи: «Ошибки при сериализации»

textual
Листинг программы
.method public hidebysig static void  Run() cil managed
{
  // Размер кода:       29 (0x1d)
  .maxstack  2
  .locals init ([0] class ThirtyNineEighty.ComTest/'<>c__DisplayClass0_0' 'CS$<>8__locals0',
           [1] class [mscorlib]System.Action action)
  IL_0000:  newobj     instance void ThirtyNineEighty.ComTest/'<>c__DisplayClass0_0'::.ctor()
  IL_0005:  stloc.0
  IL_0006:  nop
  IL_0007:  ldloc.0
  IL_0008:  ldc.i4.s   20
 
  // Вот здесь твой c__DisplayClass0_0
  IL_000a:  stfld      int32 ThirtyNineEigDisplayClass0hty.ComTest/'<>c__DisplayClass0_0'::param
  IL_000f:  ldloc.0
  IL_0010:  ldftn      instance void ThirtyNineEighty.ComTest/'<>c__DisplayClass0_0'::'<Run>b__0'()
  IL_0016:  newobj     instance void [mscorlib]System.Action::.ctor(object,
                                                                    native int)
  IL_001b:  stloc.1
  IL_001c:  ret
} // end of method ComTest::Run

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5