2011-11-28 3 views
6

Я закончил кодирование своего приложения. Но когда я нажимаю кнопку запуска, мое приложение подняло исключение ..: «(Я не знаю, почему мой класс не может быть сериализован

A first chance exception of type 'System.Runtime.Serialization.InvalidDataContractException' occurred in System.Runtime.Serialization.dll 
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll 
A first chance exception of type 'System.Runtime.Serialization.InvalidDataContractException' occurred in System.Runtime.Serialization.dll 

Так что я видел аргумент е„Application_UnhandledException“, и я мог бы знать причину «.»Тип„GPACalculator.Subject“ не может быть сериализации. Рассмотрим пометив его с атрибутом DataContractAttribute, и маркировка всех его членов вы хотите сериализованная с атрибутом DataMemberAttribute.»

Я просто сделать свой класс, используя типы данных по умолчанию ..

public class Subject : INotifyPropertyChanged 
{ 
    private string name; 
    private GradePoint gradePoint; 
    private int credit; 

    public Subject(string name) 
    { 
     Name = name; 
     GradePoint = new GradePoint(); 
    } 

    public string Name 
    { 
     get { return name; } 
     set 
     { 
      Debug.WriteLine("Name: " + value); 
      if (name != value) 
      { 
       name = value; 
       OnPropertyChanged("Name"); 
      } 
     } 

    } 

    public GradePoint GradePoint 
    { 
     get { return gradePoint; } 
     set 
     { 
      if (gradePoint != value) 
      { 
       gradePoint = value; 
       OnPropertyChanged("GradePoint"); 
      } 
     } 
    } 

    public int Credit 
    { 
     get { return credit; } 
     set 
     { 
      if (credit != value) 
      { 
       credit = value; 
       OnPropertyChanged("Credit"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 


public class GradePoint : INotifyPropertyChanged 
{ 
    private string mainGradePoint; 
    private string subGradePoint; 
    private int credit; 

    public int Credit 
    { 
     get { return credit; } 
     set 
     { 
      if (credit != value) 
      { 
       credit = value; 
       OnPropertyChanged("Credit"); 
      } 
     } 
    } 

    public string MainGradePoint 
    { 
     get { return mainGradePoint; } 
     set 
     { 
      value = value.ToUpper(); 
      if (mainGradePoint != value) 
      { 
       mainGradePoint = value; 
       OnPropertyChanged("MainGradePoint"); 
      } 
     } 
    } 

    public string SubGradePoint 
    { 
     get { return subGradePoint; } 
     set 
     { 
      if (subGradePoint != value) 
      { 
       subGradePoint = value; 
       OnPropertyChanged("SubGradePoint"); 
      } 
     } 
    } 

    public override string ToString() 
    { 
     return string.Format("{0}{1}", mainGradePoint, subGradePoint); 
    } 

    public double ToDouble(double perfectScore = 4.5F) 
    { 
     double gap = perfectScore - Math.Floor(perfectScore); 
     double value; 


     switch (mainGradePoint) 
     { 
      case "A": 
       value = 4.0; 
       break; 
      case "B": 
       value = 3.0; 
       break; 
      case "C": 
       value = 2.0; 
       break; 
      case "D": 
       value = 1.0; 
       break; 
      default: 
       value = 0.0; 
       return value; 
     } 

     switch (subGradePoint) 
     { 
      case "+": 
       value += gap; 
       break; 
      case "-": 
       value -= gap; 
       break; 
     } 

     return value; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

выше m у класса ..

пожалуйста, помогите мне

ответ

11

Start украшая классы с соответствующими атрибутами для сериализатора, который вы хотите использовать, например [Serializable] для BinaryFormatter, или [DataContract] для форматировщиков на основе контрактов.

Примечание: Если вы используете [Serializable] атрибут, не забудьте отметить поля событий с [field:NonSerialized] иначе все слушателей этих событий будет сериализовать, а также.

+0

Большое спасибо :) –

6

Как ошибке указывает вам нужно определить свой класс как сериализации, украшая его с атрибутом DataContract на классе и атрибут DataMember для его свойства. Только публичные свойства, украшенные DataMember, могут быть сериализованы. Ваши методы и события не могут.

[DataContract] 
public class Subject 
{ 
    [DataMember] 
    public string Name{get;set;} 
} 

More info here

0

Оба класса должны быть сериализации в этом случае. Добавить [Serializable] к классу

2

Вы можете попробовать маркировки класса с атрибутом

[DataContract] 
public class Subject : ... 

или пометить его сериализации как так:

[Serializable] 
public class Subject : ... 
0

Этот вопрос является излишним.

How to ignore Event class member for binary serialization?

Вы пропустили [Serializable] атрибут в своем классе, а также потому, что событие не serialable вам нужно пометить его как [field: NonSerialized] ваше событие делегата.