2009-03-16 12 views
0

J'ai une interface que deux classes implémentent pour le moment. Les données pour ces classes sont lues à partir d'un fichier XML.Stratégie pour XmlSerialization avec une interface?

par exemple.

[Serializable] 
public interface IMyInterface { } 

[Serializable] 
public class MyClass1 : IMyInterface { } 

[Serializable] 
public class MyClass2 : IMyInterface { } 

Je veux déduire le type de la Xml, est-il un moyen de le faire?

Ainsi, par exemple mon xml ressemble à ceci:

<meta type="MyClass1"> 
    <!--- Some meta data --> 
</meta> 

Je veux être en mesure de sérialiser directement à partir de XML en objets. Actuellement, je traite manuellement le fichier XML.

Éditer: Pour clarifier, je sais comment sérialiser mais je ne peux pas le sérialiser sans savoir de quel type il s'agit en premier. Dois-je lire l'attribut type, puis sérialiser en fonction de cela?

Répondre

1

Si vous utilisez XmlSerializer, vous pouvez ajouter le XmlIncludeAttribute pour spécifier les classes dérivées qui peuvent être désérialisées. Mais la chose est que vous devez l'ajouter à la base classe:

[XmlInclude(typeof(DerivedClass))] 
public abstract class BaseClass 
{ 
    public abstract bool Property { get; set; } 
} 

public class DerivedClass : BaseClass 
{ 
    public override bool Property { get; set; } 
} 

Autre moyen serait de mettre en œuvre IXmlSerializable pour le membre qui peut être dérivé, puis une usine pour les classes dérivées basées sur une attribut (ou est ce que vous faites en ce moment?)

+0

C'est ce que je fais maintenant, je vais envisager de passer à une classe de base .. Il pourrait avoir un sens de toute façon. Merci. –

-1

Je ne sais pas si cela peut aider, mais ici il va ...

si vous mettez une propriété publique sur les classes qui retourne la typename

[XmlAttribute] 
public string Type { 
    get { return GetType().Name; } 
} 
1

Le XML Serializer n'est pas destiné à des situations de ce type. Il est destiné à la sérialisation d'objets pouvant être mappés en XML décrits par un schéma XML. D'autre part, la sérialisation à l'exécution inclut un formateur SOAP qui peut sérialiser les objets, y compris les détails de leurs types .NET. Ainsi peut le NetDataContractSerializer dans WCF.

1

Si je comprends bien votre question correctement ...

ont une propriété dans l'interface, disent

[Serializable] 
public interface IMyInterface 
{ 
YourClassDifferentiatorEnum ObjectDifferentiator { get; set; } 
} 

Et que chaque classe définir cette valeur avec une valeur distincte ENUM. Sérialiser ces classes concrètes en XML. Lorsque vous souhaitez désérialiser (XML retour à l'objet concret), désérialisez-le à IMyInterface, recherchez le différenciateur d'objet et effectuez le moulage en conséquence.

Questions connexes