Почему вы не можете десериализовать интерфейс, даже если опишите тип? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть класс, состоящий из нескольких базовых типов и типов интерфейса.Я понимаю, что вы не могли просто десериализовать в типы интерфейса, потому что он не знает, какой конкретный тип использовать.

Так почему же вы не можете использовать атрибут 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; }
//}
...