Ошибки при сериализации - C#
Формулировка задачи:
Всем привет есть такая проблема, пытаюсь сериализовать объекты, но вылезает ошибка.
объект:
метод сериализации:
вот такая вот ошибка вылазиет
думал ошибка связанна с билдером, но наврядли, и на всякий случай поставил атрибут сериализации
эта бинарная сериализация, при xml сериализации выдает другую ошибку
[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; } }
Решение задачи: «Ошибки при сериализации»
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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д