2011-11-28 44 views
6

Tôi đã hoàn thành mã hóa đơn đăng ký của mình. Nhưng khi tôi nhấn nút khởi động, ứng dụng của tôi nêu ra một trường hợp ngoại lệ ..: '(Tôi không biết tại sao lớp học của mình không thể được tuần tự hóa

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 

Vì vậy, tôi thấy lập luận của e 'Application_UnhandledException', và tôi có thể biết lý do ".' Loại 'GPACalculator.Subject' không thể được đăng. Cân nhắc đánh dấu nó với thuộc tính DataContractAttribute, và đánh dấu tất cả các thành viên của nó bạn muốn serialized với thuộc tính DataMemberAttribute."

tôi chỉ làm cho lớp học của tôi sử dụng các loại dữ liệu mặc định ..

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

các ở trên là m y lớp ..

hãy giúp tôi

Trả lời

11

Bắt đầu bằng cách trang trí lớp học của bạn với các thuộc tính thích hợp cho bộ nối tiếp bạn muốn sử dụng, vd [Serializable] cho BinaryFormatter hoặc [DataContract] cho các định dạng dựa trên hợp đồng.

Lưu ý: Nếu bạn sử dụng thuộc tính [Serializable], hãy nhớ đánh dấu các trường sự kiện bằng [field:NonSerialized] nếu không, tất cả các trình nghe cũng sẽ được sắp xếp theo thứ tự là.

+0

Cảm ơn rất nhiều :) –

6

Khi lỗi khẳng định bạn cần phải xác định lớp học của bạn như serializable bởi trang trí nó với các thuộc tính DataContract trên lớp và thuộc tính DataMember để nó tính. Chỉ có các tài sản công cộng được trang trí với DataMember mới có thể được tuần tự hóa. Phương thức và sự kiện của bạn không thể.

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

More info here

0

Cả hai lớp nên được serializable trong trường hợp này. Thêm [Serializable] để lớp

2

Bạn có thể thử đánh dấu lớp với các thuộc tính

[DataContract] 
public class Subject : ... 

hoặc đánh dấu nó serializable như vậy:

[Serializable] 
public class Subject : ... 
0

Câu hỏi này không cần thiết.

How to ignore Event class member for binary serialization?

Bạn bỏ lỡ [Serializable] thuộc tính trong lớp học của bạn và cũng vì sự kiện không serialable bạn cần phải đánh dấu nó như [field: NonSerialized] sự kiện đại biểu của mình.

Các vấn đề liên quan