2009-10-15 11 views
6

J'ai donc un xml qui a une structure similaire à celle-ci:C# désérialisation partielle

<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> 

Est-il possible que je puisse désérialiser MyObject mais pas le ArrayOfOtherObject? Et puis plus tard faire une charge paresseuse de ArrayOfOtherObject en cas de besoin?

J'utilise généralement XmlDeserialization, mais je sais que ça charge toujours le tout.

Merci!

+2

Pour être honnête, à moins que le volume de données est énorme, vous seriez mieux d'aller pour l'approche la plus simple et deserialize tout. –

+0

+1 bonne question Carlo – toddmo

Répondre

2

Vous pouvez utiliser constructeur spécial qui est reconnu par la fonctionnalité désérialisation binaire:

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 
} 

En cas de XML - ici est un exemple de sérialisation personnalisé: http://geekswithblogs.net/marcel/archive/2006/05/19/78989.aspx

+0

N'est-ce pas 'BinaryFormetter'? xml est généralement 'IXmlSerializable', ce qui semble * très * différent. –

+0

Oui, Mark, vous avez raison, mais IXmlSerializable peut aussi facilement être étendu par la méthode ReadXml. –

+1

Alors, comment j'irais à ce sujet? Je ne suis vraiment pas du genre, puisque je n'ai fait que la désérialisation régulière (désérialiser l'objet entier) et seulement utiliser XmlIgnore. J'ai cherché sur le MSDN comment utiliser ceci mais c'était plutôt compliqué et ne pouvait pas se mettre au travail (parfois je déteste MSDN pour leurs exemples trop compliqués). – Carlo

0

Parlez-vous de désérialisation xml comme il est analysé de sorte que vous n'avez pas à charger le fichier xml entier en mémoire, ou à le désérialiser lorsque vous essayez d'accéder à l'objet concret?

Il pourrait aider à examiner une implémentation de SAX par opposition aux DOM:

http://www.saxproject.org/

+0

J'ai besoin de désérialiser le MyObject mais pas le ArrayOfOtherObject. Et plus tard, si demandé par l'utilisateur, je vais devoir charger le ArrayOfOtherObject, mais initialement seulement MyObject. – Carlo

+0

Une autre idée est qu'un SGBDR serait mieux adapté pour stocker et récupérer ces données de la manière dont vous avez besoin. Vous pouvez importer ces données dans une base de données relationnelle, puis les interroger en utilisant LINQ to SQL par exemple (qui utilise un chargement paresseux si je me souviens bien). – PabloC

Questions connexes