Serializable类继承自具有自己类型属性的Interface

时间:2009-11-25 18:50:12

标签: .net serialization interface xml-serialization

我有一个接口,定义了与接口类型相同的属性。

public interface IMyInterface
{
    IMyInterface parent
    {
        get;
        set;
    }
}

现在,如果我声明一个类并从接口继承,我需要创建一个名为parent的属性。我希望我的类可以序列化以在Web服务中使用,但是当使用这种方式时,接口不可序列化,那么我应该如何处理我的IMyInterface类型的属性?我确实希望该属性序列化。

2 个答案:

答案 0 :(得分:1)

有趣的是:当你用一个抽象类替换接口声明时,它可以工作。 ..甚至列表。

(嗯,实际上这不好笑......)

public class Root
{
    [XmlElementAttribute("ClassA", typeof(ClassA))]
    [XmlElementAttribute("ClassB", typeof(ClassB))]
    [XmlElementAttribute("ClassC", typeof(ClassC))]
    public List<IMyInterface> Items { get; set; }
}


public abstract class IMyInterface
{
    IMyInterface Parent { get; set; }
    string Name { get; set; }
}

答案 1 :(得分:0)

未经测试:当您使用XmlSerialization时,您可以尝试使用[XmlElement]属性为所有已知实现装饰属性。

public interface IMyInterface
{
    [XmlElement(Type=typeof(App.Projekt), ElementName="Projekt")]
    [XmlElement(Type=typeof(App.Person), ElementName="Person")]
    [XmlElement(Type=typeof(App.Task), ElementName="Task")]
    IMyInterface parent
    {
        get;
        set;
    }
}

未经测试 - 我不知道这是否也适用于接口。

编辑:我用这段代码测试了这个问题。它没用。我认为,XmlElement与“object”类型的属性相同。

public interface IMyInterface
{
    IMyInterface Parent { get; set; }
    string Name { get; set; }
}

public class ClassA : IMyInterface
{
    [XmlElement(Type = typeof(ClassA), ElementName = "ClassA")]
    [XmlElement(Type = typeof(ClassB), ElementName = "ClassB")]
    [XmlElement(Type = typeof(ClassC), ElementName = "ClassC")]
    public IMyInterface Parent { get; set; }
    public string Name { get; set; }

    public string AProperty { get; set; }
}

public class ClassB : IMyInterface
{
    [XmlElement(Type = typeof(ClassA), ElementName = "ClassA")]
    [XmlElement(Type = typeof(ClassB), ElementName = "ClassB")]
    [XmlElement(Type = typeof(ClassC), ElementName = "ClassC")]
    public IMyInterface Parent { get; set; }
    public string Name { get; set; }

    public string BProperty { get; set; }
}

public class ClassC : IMyInterface
{
    [XmlElement(Type = typeof(ClassA), ElementName = "ClassA")]
    [XmlElement(Type = typeof(ClassB), ElementName = "ClassB")]
    [XmlElement(Type = typeof(ClassC), ElementName = "ClassC")]
    public IMyInterface Parent { get; set; }
    public string Name { get; set; }

    public string CProperty { get; set; }
}

例外是:

  

“无法序列化成员   TestXMLSerializer.ClassA.Parent of   键入TestXMLSerializer.IMyInterface   因为它是一个界面。“