Исключение, которое вы получаете, говорит о том, что в AbstractClass отсутствует атрибут [DataContract].
DataContract - это атрибут, который используется для маркировки классов, которые могут быть сериализуемыми. Этот атрибут будет включать в ваш класс только те атрибуты, которые нужно сериализовать, если вы скажете это сделать с помощью атрибута DataMember.
Атрибут DataMember используется, чтобы отметить, какие атрибуты вы хотите в вашем сериализуемом классе.
Этот атрибут находится в System.Runtime.Serialization;
Например ...
public abstract class Bar
{
}
public class Foo : Bar
{
string one { get; set; }
string two { get; set; }
string three { get; set; }
}
Если я попытаюсь сериализовать свой класс Foo, я получу ваше исключение. Поэтому, если я добавлю атрибут DataContract в свой класс Bar, как предполагает исключение, в следующий раз, когда я попытаюсь сериализоваться, я получу ту же ошибку, просто указывающую на другую часть моего кода, сам класс Foo.
Что мне нужно сделать, это добавить DataContract для обоих, как это.
[DataContract]
public abstract class Bar
{
}
[DataContract]
public class Foo : Bar
{
string one { get; set; }
string two { get; set; }
string three { get; set; }
}
Так что теперь у нас будет возможность создать сериализованный файл. Однако никакой информации не будет, поскольку мы никогда не указывали нашему DataContract, что включать. Чтобы решить эту проблему, мы добавляем атрибут DataMember к атрибутам в классе, который мы хотим включить.
[DataContract]
public class Foo : Bar
{
[DataMember]
string one { get; set; }
string two { get; set; }
[DataMember]
string three { get; set; }
}
Если атрибуты DataMember добавлены при сериализации этого класса, он будет сериализовать только информацию о первой и третьей строке. Вторая строка не будет включена, поскольку она не была специально помечена атрибутом DataMember.