Проблема в том, что поле db
сериализуется, хотя, очевидно, его не нужно сериализовать (оно создается после создания объекта).
Поэтому вы должны украсить его атрибутом NonSerialized
:
[NonSerialized]
ContactDataContext db = new ContactDataContext();
[Update]
Чтобы убедиться, что поле db
доступно после инициализации объекта, вы должны использовать свойство отложенной загрузки и использовать это свойство вместо поля:
[NonSerialized]
ContactDataContext db = null;
[NonSerialized]
private ContactDataContext {
get {
if (db == null) {
db = new ContactDataContext();
}
return db;
}
set {
db = value;
}
}
public void Save()
{
Contact contact = new Contact();
contact.FirstName = FirstName;
contact.LastName = LastName;
Db.Contacts.InsertOnSubmit(contact);
Db.SubmitChanges();
}
[Update2]
Вы можете сериализовать большинство объектов, если у них есть открытый конструктор без параметров (или вообще без конструктора) и нет свойств / полей, которые не могут быть сериализованы, но требуют сериализации. Если сам класс не помечен как [Serializable]
, то вы можете сделать это самостоятельно, используя частичный класс. Если у класса есть свойства / поля, которые нельзя сериализовать, то этого можно достичь, унаследовав класс и переопределив эти свойства / поля, чтобы украсить их как [NonSerialized]
.