2009-10-15 10 views
6

So habe ich eine XML, die eine ähnliche Struktur wie diese hat:C# Teil Deserialisierung

<MyObject> 
    <PropertyA>Value</PropertyA> 
    <PropertyB>Value</PropertyB> 
    <PropertyC>Value</PropertyC> 
    <ArrayOfOtherObject> 
     <OtherObject> 
      <PropertyX>Value</PropertyX> 
      <PropertyY>Value</PropertyY> 
      <PropertyZ>Value</PropertyZ> 
     </OtherObject> 
     <OtherObject> 
      <PropertyX>Value</PropertyX> 
      <PropertyY>Value</PropertyY> 
      <PropertyZ>Value</PropertyZ> 
     </OtherObject> 
     <OtherObject> 
      <PropertyX>Value</PropertyX> 
      <PropertyY>Value</PropertyY> 
      <PropertyZ>Value</PropertyZ> 
     </OtherObject> 
    </ArrayOfOtherObject> 
</MyObject> 

Gibt es eine Möglichkeit, dass ich MyObject deserialisieren kann aber nicht die ArrayOfOtherObject? Und dann später, wenn benötigt, eine Lazy-Ladung von ArrayOfOtherObject?

Ich verwende normalerweise XmlDeserialization, aber AFAIK lädt immer das Ganze.

Danke!

+2

ehrlich zu sein, es sei denn, das Datenvolumen riesig würden Sie besser dran, geht für die einfachste Ansatz und deserialize es alles. –

+0

+1 gute Frage Carlo – toddmo

Antwort

2

Sie speziellen Konstruktor verwenden können, die durch binäre Deserialisierung Funktionalität erkannt wird:

protected MyObject(SerializationInfo info, StreamingContext context) 
{ 
//here some elements you can load right now, and some other to store in so-to-say string in order to load later 
} 

Bei XML - hier ist ein Beispiel für benutzerdefinierte Serialisierung: http://geekswithblogs.net/marcel/archive/2006/05/19/78989.aspx

+0

Ist das nicht 'BinaryFormetter'? xml ist normalerweise 'IXmlSerializable', das * sehr * anders aussieht. –

+0

Ja, Mark, Sie haben Recht, aber IXmlSerializable kann auch einfach über die ReadXml-Methode erweitert werden. –

+1

Also wie würde ich darüber gehen? Ich bin wirklich noob mit diesem, da ich nur die regelmäßige Deserialisierung (Deserialisierung des gesamten Objekts) und nur XmlIgnore verwendet habe. Ich suchte auf der MSDN, wie man das benutzt, aber es war ziemlich kompliziert und konnte zur Arbeit nicht kommen (manchmal hasse ich MSDN für ihre übermäßig komplizierten Beispiele). – Carlo

0

Sprechen Sie die xml über Deserialisieren wie es geparst wird, so dass Sie nicht die gesamte XML-Datei in den Speicher laden müssen, oder deserialisieren, wenn Sie versuchen, auf das konkrete Objekt zuzugreifen?

Es könnte bei einer Implementierung von SAX suchen helfen, wie DOM Gegensatz:

http://www.saxproject.org/

+0

Ich muss das MyObject aber nicht das ArrayOfOtherObject deserialisieren. Und später, wenn vom Benutzer angefordert, muss ich das ArrayOfOtherObject laden, aber zunächst nur das MyObject. – Carlo

+0

Ein anderer Gedanke ist, dass ein RDBMS zum Speichern und Abrufen dieser Daten in der von Ihnen benötigten Weise besser geeignet wäre. Sie könnten diese Daten in eine relationale Datenbank importieren und sie dann zum Beispiel mit LINQ to SQL abfragen (was, wie ich mich erinnere, lazy loading verwendet). – PabloC