2011-11-28 13 views
6

Zakończyłem kodowanie mojej aplikacji. Ale po kliknięciu przycisku start, moja aplikacja podniósł wyjątki ..: '(Nie wiem, dlaczego moja klasa nie może być serializowana

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 

Więc widziałem argumentu o 'e' Application_UnhandledException i mogłam poznać przyczynę „.' Type 'GPACalculator.Subject' nie może być w odcinkach. Rozważmy oznakowanie go z atrybutem DataContractAttribute i oznakowanie wszystkich swoich członków chcesz odcinkach z atrybutem DataMemberAttribute.”

ja po prostu zrobić moją klasę używając domyślne typy danych ..

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)); 
    } 
} 

powyżej jest m klasa y ..

pomóż mi

Odpowiedz

11

Zacznij od dekorowania swoje zajęcia z odpowiednimi atrybutami dla serializera, którego chcesz użyć, np [Serializable] dla BinaryFormatter lub [DataContract] dla formaterów opartych na kontraktach.

Uwaga: W przypadku korzystania z [Serializable] atrybut, należy pamiętać, aby zaznaczyć pola zdarzenia z [field:NonSerialized] inaczej wszystkich słuchaczy z tych wydarzeń będzie serializacji jak również.

+0

Wielkie dzięki :) –

6

jako błąd stwierdza trzeba zdefiniować swoją klasę jako serializable przez zdobiące ją z atrybutem DataContract na klasy i atrybutu DataMember na jego właściwości. Tylko publiczne właściwości ozdobione DataMember można serializować. Twoje metody i zdarzenia nie mogą.

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

More info here

0

Obie klasy powinien być możliwy do serializacji w tym przypadku. Dodaj [Serializable] do klasy

2

Można spróbować oznaczenie klasy z atrybutem

[DataContract] 
public class Subject : ... 

lub oznaczyć go serializable tak:

[Serializable] 
public class Subject : ... 
Powiązane problemy