2016-05-07 17 views
1

Ich habe das Problem mit meinem XML-Serialisierungsproblem. Ich habe an meinem Projekt gearbeitet, um ein Objekt mit einem Interface als Attribut zu (de) serialisieren. Ich weiß, dass Sie eine Schnittstelle nicht serialisieren können, und das ist, was mein Fehler mir sagt. HierSerialisieren Sie ein Objekt mit einer Schnittstelle

ist ein Beispiel für das Objekt, das ich in einer Datei gespeichert werden soll:

public class Task 
{ 
    public int id; 
    public string name; 
    public TypeEntree typeEntree; 
    public int idRequired; 
    public string code; 
    public int waitTime; 
    public string nameApp; 
    // ... Constructors (empty and non-empty) and methods ... 
} 

TypeEntree ist eine leere Schnittstelle, ist es nur verschiedene Objekte beziehen und nutzen sie leicht um meine Anwendung. Zum Beispiel sind hier zwei der Objekte, die diese Schnittstelle verwendet:

[Serializable] 
public class Mouse : TypeEntree 
{ 
    public Point point; 
    public IntPtr gaucheOuDroite; 
    public string image; 
    // ... Constructors (empty and non-empty) and methods ... 
} 

[Serializable] 
public class Sequence : TypeEntree 
{ 
    public List<Tuple<string, Point, long, IntPtr>> actions; 
    // ... Constructors (empty and non-empty) and methods ... 
} 

Die Schnittstelle TypeEntree hat auch das Attribut [Serializable] und auch die [XmlInclude (typeof (Mouse)] für jede meiner Klassen, die diese verwendet . Schnittstelle

Hier meine Frage: Warum, wenn ich zu serialisiert versuchen, es nicht die Art meines Objekt (typeEntree im Task) erfasst, kann, da ich die [XmlInclude (typeof (Mouse)] hinzugefügt Attribute

?

Auch, wie soll ich dieses Problem beheben?

Hinzu kommt noch, hier sind die Methoden der Serialisierung/Deserialisierung fand ich, dass scheint funktioniert sehr gut ohne Schnittstelle: https://stackoverflow.com/a/22417240/6303528

+0

welchen Serializer verwenden Sie? – rene

+0

Im letzten Satz gebe ich es an. http://Stackoverflow.com/a/22417240/6303528 - XML ​​ XmlSerializer –

+0

Der Serializer fügt die Attribute nicht zum Serialisieren hinzu, sondern zum Deinserialisieren. Die Netzbibliothek benötigt die Attribute beim Deserialisieren, um zwischen den vererbten Klassen zu unterscheiden. – jdweng

Antwort

1

Dank Links in den Kommentaren meiner ersten Fragen @dbc, ich war in der Lage, um herauszufinden, jedes Problem. Hier ist, was ich getan habe:

Meine Schnittstelle TypeEntree wurde eine abstrakte Klasse.

[Serializable] 
[XmlInclude(typeof(Mouse))] 
[XmlInclude(typeof(Keyboard))] 
[XmlInclude(typeof(Sequence))] 
public abstract class TypeEntree 
{ 
} 

Auch die Maus-Klasse hatte eine IntPtr, die nicht serialisierbar ist. Ich musste es in ein Int64 (ein lang) umwandeln. Quelle ist sowohl von @dbc Kommentare und hier: Serialize an IntPtr using XmlSerializer

Schließlich kann ein Tupel nicht serialisiert werden, da es keinen parameterlosen Konstruktor hat. Ein Update für dies ist einfach die Art des Tuple der Klasse ändern, die ich erstellt (TupleModifier) ​​im Anschluss an diesem Beispiel: https://stackoverflow.com/a/13739409/6303528

public class TupleModifier<T1, T2, T3, T4> 
{ 
    public T1 Item1 { get; set; } 
    public T2 Item2 { get; set; } 
    public T3 Item3 { get; set; } 
    public T4 Item4 { get; set; } 

    public TupleModifier() { } 

    public static implicit operator TupleModifier<T1, T2, T3, T4>(Tuple<T1, T2, T3, T4> t) 
    { 
     return new TupleModifier<T1, T2, T3, T4>() 
     { 
      Item1 = t.Item1, 
      Item2 = t.Item2, 
      Item3 = t.Item3, 
      Item4 = t.Item4 
     }; 
    } 

    public static implicit operator Tuple<T1, T2, T3, T4>(TupleModifier<T1, T2, T3, T4> t) 
    { 
     return Tuple.Create(t.Item1, t.Item2, t.Item3, t.Item4); 
    } 
} 

und es in der Sequenzklasse zu verwenden, wie es früher war:

public List<TupleModifier<string, Point, long, long>> actions; 
Verwandte Themen