У меня есть класс, состоящий из нескольких базовых типов и типов интерфейса.Я понимаю, что вы не могли просто десериализовать в типы интерфейса, потому что он не знает, какой конкретный тип использовать.
Так почему же вы не можете использовать атрибут Xml, чтобы определить конкретный тип, который будет использоваться, как вы можетеесли у вас был абстрактный тип?
Вот упрощенная версия моего кода, чтобы показать проблему.Ошибка всегда в том, что он не может создать интерфейс типа «MyType».Если я поменяю интерфейсный тип для абстрактного типа с тем же именем (который я здесь закомментировал для удобства), то он будет работать, как и ожидалось.
Первоначально я получил идею из этого поста, которая предполагает, что это должно быть возможно: https://blog.codeinside.eu/2015/10/25/xml-deserialize-to-abstract-class-interface-or-base-class/
class Program
{
static String MultipleInstancesRequired =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<MyComponent>" +
"<Name>Component123</Name>" +
"<SpecialType>" +
"<Description>Some Awesome Component</Description>" +
"<Value>42</Value>" +
"</SpecialType>" +
"</MyComponent>";
static void Main(string[] args)
{
MyComponent comp = PopulateComponent();
}
private static MyComponent PopulateComponent()
{
MyComponent component;
XmlSerializer obj = new XmlSerializer(typeof(MyComponent), new XmlRootAttribute("MyComponent"));
Stream stream = new MemoryStream(Encoding.ASCII.GetBytes(MultipleInstancesRequired));
component = (MyComponent)obj.Deserialize(stream);
return component;
}
}
[Serializable]
public class MyComponent
{
[XmlElement]
public string Name { get; set; }
[XmlElement(typeof(RealType), ElementName = "SpecialType")]
public MyType SpecialType { get; set; }
}
[Serializable]
public class RealType : MyType
{
[XmlElement]
public string Description { get; set; }
[XmlElement]
public int Value { get; set; }
}
public interface MyType
{
string Description { get; set; }
int Value { get; set; }
}
//public abstract class MyType
//{
// [XmlElement]
// public string Description { get; set; }
// [XmlElement]
// public int Value { get; set; }
//}