DataContractSerializer требует конструктора без параметров в абстрактном базовом классе

Когда у меня есть следующие классы, и я пытаюсь сериализовать экземпляр ConcreteClass с помощью DataContractSerializer .WriteObject (..) , я получаю InvalidDataContractException .

public abstract class AbstractClass
{            
  protected AbstractClass(string text) { }
}

public class ConcreteClass : AbstractClass
{
  public ConcreteClass() : base("text") {  } 
}

Сериализатор создается с помощью нового DataContractSerializer (typeof (ConcreteClass) .

Использование XmlSerializer не вызывает проблем. Теперь при добавлении

]

нет проблем. public AbstractClass () {}

работают оба сериализатора.

Так почему же DataContractSerializer требует, чтобы абстрактные базовые классы имели конструктор без параметров? Здесь указано, что типы могут быть сериализованы, которые "иметь конструктор, не имеющий параметров", что верно для ConcreteClass. Я также добавил код в этот требуемый конструктор, и я не думаю, что он когда-либо вызывается во время процесса сериализации.


Полное исключение гласит:

System.Runtime.Serialization.In validDataContractException: Тип AbstractClass 'не может быть сериализован. Подумайте о том, чтобы пометить его DataContractAttribute, и пометив всех его членов, вы хотите сериализовать с атрибутом DataMemberAttribute. Увидеть Документация Microsoft .NET Framework для других поддерживаемых типов.

Она работает, даже если я оставлю конструктор без параметров и вместо этого использую предложенный атрибут. Так почему же существует разница и почему предпринимается попытка сериализации абстрактного класса? Конечно, в абстрактном классе могут быть такие вещи, как свойства, но разве их не следует сериализовать вместе с экземпляром ConcreteClass (который наследует такие вещи)?

Изменить :

Мой точный код:

namespace SerilizationTest
{
  public abstract class AbstractClass
  {
    public string StringProperty { get; set; }

    //This constructor is required (although never called).
    //If not present we get "InvalidDataContractException :
    //Type AbstractClass cannot be serialized"
    public AbstractClass()
    {
      Console.WriteLine("We won't see this.");
    }

    public AbstractClass(string text)
    {
      StringProperty = text;
    }
  }

  public class ConcreteClass : AbstractClass
  {
    public ConcreteClass() : base("text") { }
  }

  class Program
  {
    static void Main()
    {
      var serializer = new DataContractSerializer(typeof(ConcreteClass));
      var memStream = new MemoryStream();
      serializer.WriteObject(memStream, new ConcreteClass());
      memStream.Seek(0, SeekOrigin.Begin);
      var deserializedObj = (ConcreteClass)serializer.ReadObject(memStream);
      Console.WriteLine(deserializedObj.StringProperty);
    }
  }
}

6
задан Luke Puplett 21 July 2015 в 10:52
поделиться