2010-03-23 26 views
8
public void Save() { 
      XmlSerializer Serializer = new XmlSerializer(typeof(DatabaseInformation)); 
      /* 
      A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll 
      A first chance exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll 
      A first chance exception of type 'System.InvalidOperationException' occurred in System.Xml.dll 
      */ 

      // .... 
    } 

Đây là cả lớp nếu bạn cần nó:Tại sao XmlSerializer ném một InvalidOperationException?

public class DatabaseInformation 
{ 
    /* Create new database */ 
    public DatabaseInformation(string name) { 
     mName = name; 
     NeedsSaving = true; 
     mFieldsInfo = new List<DatabaseField>(); 
    } 

    /* Read from file */ 
    public static DatabaseInformation DeserializeFromFile(string xml_file_path) 
    { 
    XmlSerializer Serializer = new XmlSerializer(typeof(DatabaseInformation)); 
     TextReader r = new StreamReader(xml_file_path); 
     DatabaseInformation ret = (DatabaseInformation)Serializer.Deserialize(r); 
     r.Close(); 
     ret.NeedsSaving = false; 
     return ret; 
    } 

    /* Save */ 
    public void Save() { 
    XmlSerializer Serializer = new XmlSerializer(typeof(DatabaseInformation)); 
     if (!mNeedsSaving) 
      return; 

     TextWriter w = new StreamWriter(Path.Combine(Program.MainView.CommonDirectory.Get(), Name + ".xml"), false); 
     Serializer.Serialize(w, this); 
     w.Close(); 
     NeedsSaving = false; 
    } 

    private string mName; 
    public string Name { get { return mName; } } 

    private bool mNeedsSaving; 
    public bool NeedsSaving { get { return mNeedsSaving; } set { mNeedsSaving = value; Program.MainView.UpdateTitle(value); } } 

    private bool mHasId; 
    public bool HasId { get { return mHasId; } } 

    List<DatabaseField> mFieldsInfo; 
} 

(PS: nếu bạn có bất cứ lời khuyên để cải thiện mã của tôi cảm thấy tự do để chia sẻ, tôi một C# mới bắt đầu)

+0

Bạn có thể dán thông báo ngoại lệ vào đây không? –

+1

Vui lòng đăng thông tin ngoại lệ hoàn chỉnh, bao gồm ngoại lệ bên trong - và các văn bản tài liệu theo (tức là tin nhắn). Bạn thực sự bỏ lỡ thông điệp thường chứa nhiều thông tin hơn. – TomTom

Trả lời

13

Để tuần tự hóa/deserialize loại của bạn, nó cần phải có constructor parameterless. Kiểm tra here:

Lớp học phải có hàm tạo mặc định để được tuần tự hóa XmlSerializer.

+6

Loại của tôi có hàm tạo tham số và tôi vẫn gặp lỗi này. Nó chỉ ra nguyên nhân là một tài sản công cộng với loại Uri mà không có constructor parameterless. Vì vậy, bên cạnh loại của bạn, các thuộc tính công khai của bạn trong loại đó cũng phải có hàm tạo tham số. – user850010

+0

đã lưu ngày của tôi !!! – Leviathan

+0

Khi tôi bắt gặp ngoại lệ này và kiểm tra một số cấp độ của InnerException liên kết với nó, tôi thấy một trong các đối tượng lồng nhau của tôi có một thành viên có loại là một giao diện (IEnumerable) và đây không phải là serializable. Tôi đoán tôi sẽ phải chuyển đổi nó thành một loại cụ thể. – Neek

6

oh .. Tôi không biết nó có thêm thông tin (phải bấm vào nút "Xem chi tiết .."), bí ẩn được giải quyết:

nhắn = SDB.DatabaseInformation không thể được tuần tự bởi vì nó không có một hàm tạo không tham số.

0

Bạn có thể giải quyết vấn đề này bằng cách cung cấp hàm tạo mặc định gọi hàm tạo quá tải. Ví dụ:

public DatabaseInformation() : this ("defaultName"){} 
1

Tôi cũng nhận được ngoại lệ này, nhưng không phải do thiếu hàm tạo mặc định. Tôi có một số thuộc tính bổ sung (một số ListDictionary) không phải là một phần của tài liệu XML.

Trang trí các thuộc tính đó với [XmlIgnore] giải quyết được sự cố cho tôi.

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