2009-03-16 3 views
0

Ich habe eine Schnittstelle, die zwei Klassen im Moment implementieren. Die Daten für diese Klassen werden aus einer XML-Datei eingelesen.Strategie für XmlSerialisierung mit einer Schnittstelle?

z.B.

[Serializable] 
public interface IMyInterface { } 

[Serializable] 
public class MyClass1 : IMyInterface { } 

[Serializable] 
public class MyClass2 : IMyInterface { } 

Ich möchte den Typ aus dem Xml, gibt es eine Möglichkeit, das zu tun?

So zum Beispiel meine xml sieht wie folgt aus:

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

ich direkt in der Lage sein wollen, aus XML in Objekte zu serialisieren. Derzeit bearbeite ich das XML manuell.

Edit: Um zu klären, ich weiß, wie zu serialisieren, aber ich kann nicht wieder in serialisieren, ohne zu wissen, welcher Typ es zuerst ist. Sollte ich das type-Attribut lesen und dann serialisieren? verwenden gibt

Antwort

1

Wenn Sie XmlSerializer können Sie die XmlIncludeAttribute hinzufügen, um die abgeleiteten Klassen anzugeben, die deserialisiert werden können. Aber die Sache ist, dass man es auf die Basis Klasse hinzufügen:

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

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

Andere Möglichkeit wäre IXmlSerializable für das Element zu implementieren, die abgeleitet werden können, und haben dann eine Fabrik für abgeleitete Klassen auf der Grundlage eines Attribut (oder ist das, was Sie gerade tun?)

+0

Das ist es, was ich jetzt mache, ich werde darüber nachdenken, zu einer Basisklasse zu wechseln. Es könnte einen Sinn ergeben. Vielen Dank. –

-1

Ich weiß nicht, ob dies, aber hier helfen kann, es geht ...

Was ist, wenn Sie sich auf den Klassen eine öffentliche Eigenschaft setzen, der den Typnamen

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

Der XML-Serializer ist nicht für solche Situationen gedacht. Es ist zum Serialisieren von Objekten gedacht, die in XML abgebildet werden können und durch ein XML-Schema beschrieben werden.

Auf der anderen Seite enthält Runtime-Serialisierung einen SOAP-Formatierer, der Objekte, einschließlich Details ihrer .NET-Typen, serialisieren kann. So kann der NetDataContractSerializer in WCF.

1

Wenn ich Ihre Frage richtig verstanden hat ...

haben eine Eigenschaft in Ihrer Schnittstelle, sagt

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

und jede Klasse diesen Wert mit eindeutigem ENUM-Wert eingestellt lassen. Serialisieren Sie diese konkrete Klasse in XML.

Wenn Sie deserialisieren möchten (XML zurück zum konkreten Objekt), dann es auf IMyInterface deserialisieren, nach dem Objektdifferenzierer suchen und entsprechend umwandeln.