Deserialize Inherited class с DataContractSerializer (typeof (BaseClass))

в моем приложении Silverlight 4. Я сериализую / десериализую данные с помощью DataContractSerializer. У меня может быть два разных типа данных: EditorModel и ConfiguratorModel. Обе модели наследуют от общего базового класса.

[DataContract(IsReference = true, Name = "ServiceModel", Namespace = "ServiceModeller.DataModel.Serialization")]
[KnownType(typeof(DTO_ServiceModelEditor))]
[KnownType(typeof(DTO_ServiceModelConfigurator))]
public abstract class DTO_ServiceModelBase { ... }

[DataContract(IsReference = true, Name = "ServiceModelEditor", Namespace = "ServiceModeller.DataModel.Serialization")]
public class DTO_ServiceModelEditor : DTO_ServiceModelBase { ... }

[DataContract(IsReference = true, Name = "ServiceModelConfigurator", Namespace = "ServiceModeller.DataModel.Serialization")]
public class DTO_ServiceModelConfigurator : DTO_ServiceModelBase { ... }

Сериализация не проблема и работает должным образом. При десериализации я не хочу называть конкретный унаследованный класс, потому что пользователь также может загрузить EditorModel или ConfiguratorModel. Я нашел этот вопрос о переполнении стека , на который ответил Марк Гравелл, и, насколько я понимаю, я могу использовать базовый класс, когда он знает унаследованные типы (что он знает, см. KnownType-Declaration в DTO_ServiceModelBase).

Тем не менее, когда я выполняю следующую десериализацию (я также добавил оба унаследованных типа в качестве второго параметра):

DataContractSerializer serializer = new DataContractSerializer(typeof(DTO_ServiceModelBase), new Type[] {typeof(DTO_ServiceModelEditor), typeof(DTO_ServiceModelConfigurator)} );
System.Xml.XmlReader reader = System.Xml.XmlReader.Create(new System.IO.StringReader(stream));
// stream is the serialized string

object result;
try
{
  result = serializer.ReadObject(reader);
}
catch (Exception ex)
{ .. }

Он генерирует исключение, потому что ожидает «ServiceModel», но нашел «ServiceModelEditor». Я что-то забыл, или я ошибся в ответе Марка?

Заранее спасибо,
Фрэнк

6
задан Community 23 May 2017 в 12:31
поделиться