2009-10-15 10 views
6

Así que tiene un xml que tiene una estructura similar a esto:C# deserialización parcial

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

¿Hay una manera que puedo deserializar MiObjeto pero no el ArrayOfOtherObject? ¿Y luego hacer una carga lenta de ArrayOfOtherObject cuando sea necesario?

Normalmente uso XmlDeserialization, pero AFAIK siempre lo carga todo.

Gracias!

+2

Para ser sinceros, a menos que el volumen de datos es enorme que sería mejor ir para el enfoque más simple, y deserializar todo. –

+0

+1 buena pregunta Carlo – toddmo

Respuesta

2

Puede utilizar el constructor especial que es reconocido por la funcionalidad deserialización binaria:

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 caso de XML - aquí es un ejemplo de serialización personalizado: http://geekswithblogs.net/marcel/archive/2006/05/19/78989.aspx

+0

¿No es ese 'BinaryFormetter'? xml es típicamente 'IXmlSerializable', que se ve * muy * diferente. –

+0

Sí, marca, tienes razón, pero IXmlSerializable también se puede extender fácilmente a través del método ReadXml. –

+1

Entonces, ¿cómo iba a hacer esto? Soy realmente novato con esto, ya que solo he hecho la deserialización regular (deserializar todo el objeto) y solo he usado XmlIgnore. Busqué en MSDN cómo usar esto, pero fue bastante complicado y no pude ponerme a trabajar (a veces odio MSDN por sus ejemplos demasiado complicados). – Carlo

0

¿Estás hablando de deserializar el XML como se analiza para que no tenga que cargar todo el archivo xml en la memoria, o deserializarlo cuando intenta acceder al objeto concreto?

Podría ayudar a mirar a una implementación de SAX a diferencia de DOM:

http://www.saxproject.org/

+0

Necesito deserializar el MyObject pero no el ArrayOfOtherObject. Y más adelante, si el usuario lo solicita, tendré que cargar el ArrayOfOtherObject, pero inicialmente solo el MyObject. – Carlo

+0

Otra idea es que un RDBMS sería más adecuado para almacenar y recuperar esta información de la manera que requiera. Puede importar estos datos en una base de datos relacional y luego consultarlos usando LINQ to SQL, por ejemplo (que usa la carga diferida como recuerdo). – PabloC

Cuestiones relacionadas