2009-11-25 3 views
0

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

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

Теперь, если я объявляю класс и наследую от интерфейса, мне нужно создать свойство, называемое parent. Я хочу, чтобы мой класс был сериализуемым для использования в веб-службе, но интерфейсы не могут быть сериализованы при использовании таким образом, поэтому что мне делать с моим свойством типа IMyInterface? Я хочу, чтобы это свойство сериализовалось.

ответ

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; 
    } 
} 

Не проверено. Я не знаю, будет ли это работать и на интерфейсах.

EDIT: Я проверил эту проблему с помощью этого кода. Это не сработало. Я думал, что XmlElement будет делать то же самое, что и с Свойством типа «объект».

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 из типа TestXMLSerializer.IMyInterface , потому что это интерфейс."

+0

Не появляется на работе. Я также пробовал использовать атрибут XmlInclude без везения – Jeremy

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; } 
} 
+0

Это отлично работает! Спасибо! :) –

Смежные вопросы