2017-06-08 1 views
2

Ich verwende .NET Core 1.1 und eine Konsolenanwendung zu schreiben. Ich muss ein Objekt mit einigen grundlegenden Eigenschaften von Strings und int sowie einigen IEnumerable Objects serialisieren und es als XML serialisieren, damit ich es in einer Datei "data.xml" speichern kann..Net Core Serialisieren Sie ein Objekt mit IEnumerables <T>, um als XML zu speichern

Ich erhalte die Ausnahme: System.Runtime.Serialization.SerializationException: 'Typ' System.Collections.Generic.List`1 [[CorpsDataExtractor.ViewModels.LegacyView, CorpsDataExtractor, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] 'mit Datenvertragsname' ArrayOfLegacyView: http://schemas.datacontract.org/2004/07/CorpsDataExtractor.ViewModels 'wird nicht erwartet. Fügen Sie statische Typen, die der Liste bekannter Typen nicht bekannt sind, hinzu, z. B. indem Sie das KnownTypeAttribute-Attribut verwenden oder indem Sie sie der Liste bekannter Typen hinzufügen, die an DataContractSerializer übergeben werden.

Ich bin derzeit in der Lage, mein Objekt als JSON zu serialisieren, habe aber Probleme mit dem DataContractSerializer. Ich habe die Liste bekannter Typen hinzugefügt, für die der Ausnahmezustand fehlt, der jedoch fehlschlägt.

// This List isretrieved using Entity Framework Core 
     List<LegacyView> legacyData = await _corpsRepo.ListLegacyData(); 

// The Below Line will write to a JSON File. No Error and works 
     File.WriteAllText(@"E:\\CorporationsDataLegacy.json", JsonConvert.SerializeObject(legacyData)); 

// This Creates a Known Type List for the DataContractSerializer 
     var knownTypeList = new List<Type> 
     { 
      typeof(LegacyView), 
      typeof(People), 
      typeof(DocumentType) 
     }; 

     FileStream writer = new FileStream(@"E:\\data.xml", FileMode.Create); 
     var ser = new DataContractSerializer(typeof(LegacyView), knownTypeList); 
// When Debugging I Receive The stated exception at this line 
     ser.WriteObject(writer, legacyData); 

sind unten meine Klasse Viewmodels:

Legacy-Ansicht

[DataContract] 
public class LegacyView 
{ 
    [DataMember] 
    public string Ubi { get; set; } 
    [DataMember] 
    public IEnumerable<Person> People{ get; set; } 
    [DataMember] 
    public IEnumerable<DocumentType> DocumentTypes { get; set; } 
} 

Person

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string FirstName { get; set; } 
    [DataMember] 
    public string MiddleName { get; set; } 
} 

Dokumente

[DataContract] 
public class DocumentType 
{ 
    [DataMember] 
    public string Document { get; set; } 
    [DataMember] 
    public DateTime? CompletedDate { get; set; } 
} 

Irgendwelche Richtung auf was ich vermisse?

+0

Haben Sie versucht, 'typeof (IEnumerable ) hinzuzufügen, typeof (IEnumerable )' zu den bekannten Typen? – Gusman

+0

@Gusman, mit einer Kombination aus Ihrer Antwort und Antwort funktionierte, verließ ich meine Eigenschaften als IEnumerable, aber wo ich meine KnownType-Liste deklarierte ich musste diese Beton mit Hilfe der Liste CodeSurvivor

+0

Glad Sie haben es funktioniert. Fügen Sie Ihre Lösung als Antwort hinzu, da dies anderen mit Ihrem Problem helfen kann. – Gusman

Antwort

1

Durch die Verwendung beider Gusman und LB2 Kommentare konnte ich das Problem lösen. Da LB2 "mit IEnumerable als Typ angibt, würde Deserializer nicht wissen, welche Klasse tatsächlich instanziiert wird, um die Schnittstelle während der Deserialisierung zu unterstützen."

Dies ist der Grund, warum der Fehler aufgetreten ist, jedoch das Problem nicht auf der Klasse LegacyView [DataMember] -Ebene existierte, existierte es bei den bekannten Typen, die in den DataContractSerializer übergeben wurden.

Gusman war richtig, dass ich dem DataContractSerializer mitteilen musste, dass diese ein aufzählbarer Typ sein würden.

// I needed to tell the DataContractSerializer what the types were 
    var knownTypeList = new List<Type> 
    { 
     typeof(List<LegacyView>), 
     typeof(List<People>), 
     typeof(List<DocumentType>) 
    }; 

    using (var writer = new FileStream(@"E:\\myTestExample.xml", FileMode.Create)) 
    { 
     var ser = new DataContractSerializer(typeof(LegacyView), ktList); 
     ser.WriteObject(writer, legacyData); 
    } 
1

Ich könnte ein wenig abweichen, da ich mehr von XmlSerialize als von DataContracts gemacht habe, aber ich glaube, beide gehen von einer eventuellen Deserialisierung des Inhalts aus. Und mit dem Typ IEnumerable<T> würde Deserializer nicht wissen, welche Klasse tatsächlich instanziiert wird, um die Schnittstelle während der Deserialisierung zu unterstützen. Ändern Sie Felder in konkrete Klassen statt Aufzählung, und das sollte funktionieren.

+0

Ich schätze Ihre Eingabe. Ich habe sie in konkrete Klassen geändert und immer noch denselben Fehler erhalten.Ich werde das Attribut "Bekannter Typ" hinzufügen und prüfen, ob es das Problem behebt, obwohl der Fehler besagt, dass ich die Liste bekannter Typen verwenden kann. – CodeSurvivor

+0

Obwohl ich den [Datamember] nicht in eine konkrete Klasse ändern musste, musste ich die Liste bekannter Typen in eine konkrete Klasse ändern. Die Antwort war also eine Kombination zwischen Ihnen und Gusman – CodeSurvivor

Verwandte Themen