Objekt mit Unterpositionen c # serialisieren

8

var speichern = GetStore ();     Verwenden (IsolatedStorageFileStream fileStream = store.OpenFile (RootData, FileMode.Create))     {         DataContractSerializer Serializer = neuer DataContractSerializer (typeof (List));         serializer.WriteObject (dateiStream, rootdatalist);     }

Aber das serialisiert nur den Rootdatalist und nicht die Unterelemente. Der Rootdatalist hat eine List-Eigenschaft für Knoten, wie kann ich diese serialisieren, damit die Listenhierarchie serialisiert wird?

Da es sich um dbml-generierte Objekte handelt, ist die Nodes-Eigenschaft von Root

%Vor%

Meine Datenkontextrückgabe lautet:

%Vor%

Das Knoten-Entityset sieht in meinem dbml-Designer wie folgt aus:

%Vor%

Außerdem muss das [Include] -Tag über meinen Eigenschaften stehen oder nichts wird geladen. Bearbeiten:: Für andere, die dbml-Klassen serialisieren möchten Ссылка

    
Jakob 20.06.2010, 18:35
quelle

3 Antworten

9

Können Sie weitere Informationen zu den Vertragsarten hinzufügen? Ich würde erwarten zum Beispiel, dass Root als Datenvertrag markiert ist, mit dem Mitglied als Datenelement, zum Beispiel:

%Vor%

Das sollte dann funktionieren. Wenn nicht, würde es wirklich helfen, Ihre Typen zu sehen (oder eine beschnittene Version von ihnen, die das Problem darstellt).

    
Marc Gravell 20.06.2010, 18:50
quelle
7

Das DataContractSerializer muss über alle der Typen in Ihrem Objektdiagramm wissen.

Verwenden Sie die Konstruktorüberladung , mit der Sie diese sowie den Stammtyp angeben können:

%Vor%     
Oded 20.06.2010 18:41
quelle
0

OK; Ich habe noch einmal versucht, dies zu reproduzieren, indem ich die Person / PersonPhone -Tabellen (im Schema Person ) von einer neuen AdventureWorks2008R2-Installation verwendet habe.

Ich habe den Datenkontext auf "unidirektionale" Serialisierung gesetzt, mit Standard-LINQ-zu-SQL-Bindings usw. (keine Anpassungen).

Um mit Ihrem Szenario zu vergleichen, kann Person PersonPhone s haben, und wir sind an einem List<Person> interessiert. Ich habe mir 3 Szenarien angeschaut, von denen jedes den vollständigen Datensatz betrachtet:

  1. Serialisierung einer Vanilla-Menge von Person records
  2. das gleiche wie 1, aber mit LoadWith , um die Telefoneinträge zu erhalten
  3. das gleiche wie 1, aber die Daten manuell iterieren (Hinweis: dies kann zu N + 1 Problemen führen)

Hier sind die Ergebnisse; Wie Sie sehen, scheitert 1 in der Art, wie Sie beschreiben, aber 2 & amp; 3 funktionieren gut, mit der Unterscheidung, dass 3 signifikant mehr TSQL funktioniert.

So ohne weitere Details (idealerweise ein vollständig reproduzierbares Beispiel), es ist sehr schwer, weiter zu untersuchen ...

Ergebnisse:

%Vor%

Prüfstand:

%Vor%

Als Nebenbemerkung konnte ich > protobuf-net optimieren, um L2S dazu zu bringen, ihm die Daten zu geben (wobei DataContractSerializer beschließt, es zu ignorieren), aber dies reproduziert Szenario 3 mit einem großen N +1 Kosten Folglich plane ich nicht, das zu verfolgen ...

    
Marc Gravell 07.07.2010 10:11
quelle

Tags und Links