2011-11-28 16 views
6

Ho completato la codifica dell'applicazione. Ma quando si sceglie pulsante di avvio, la mia app ha sollevato eccezioni ..: '(Non so perché la mia classe non possa essere serializzata

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 

così ho visto l'argomento e di 'Application_UnhandledException', e ho potuto conoscere il motivo ".' Tipo 'GPACalculator.Subject' non può essere serializzato. Prendere in considerazione la marcatura con l'attributo DataContractAttribute, e marcatura tutti i suoi membri che si desidera serializzato con l'attributo DataMemberAttribute."

ho solo fare la mia classe utilizzando i tipi di dati di default ..

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

il sopra è m Classe Y ..

ti prego, aiutami

risposta

11

Inizia da decorare le classi con gli attributi appropriati per il serializzatore che si desidera utilizzare, ad es [Serializable] per BinaryFormatter o [DataContract] per i formattori basati su contratto.

Nota: Se si utilizza l'attributo [Serializable], ricordati di segnare i campi evento con [field:NonSerialized] altrimenti tutti gli ascoltatori di quegli eventi verrà serializzato pure.

+0

Grazie mille :) –

6

Come l'errore afferma è necessario definire la classe come serializzabile da decorare con l'attributo DataContract sulla classe e l'attributo DataMember per le sue proprietà. Solo le proprietà pubbliche decorate con DataMember possono essere serializzate. I tuoi metodi ed eventi non possono.

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

More info here

0

Entrambi classe dovrebbe essere serializzabile in questo caso. Aggiungere [Serializable] per la classe

2

Si potrebbe provare che segna la classe con l'attributo

[DataContract] 
public class Subject : ... 

o segnarlo serializzabile in questo modo:

[Serializable] 
public class Subject : ... 
Problemi correlati