2009-10-15 9 views
6

Tak Mam XML, który ma strukturę podobną do tej:C# Częściowa deserializacji

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

Czy istnieje sposób, że mogę deserializowania MyObject ale nie ArrayOfOtherObject? A później, gdy zajdzie taka potrzeba, wykonaj leniwy ładunek ArrayOfOtherObject?

Zazwyczaj używam XmlDeserialization, ale AFAIK zawsze ładuje całość.

Dzięki!

+2

Szczerze mówiąc, chyba że ilość danych jest ogromna można byłoby lepiej iść na najprostszym podejściem i Cofnięcie to wszystko. –

+0

+1 dobre pytanie Carlo – toddmo

Odpowiedz

2

Można użyć specjalnego konstruktora, który jest rozpoznawany przez binarnego funkcjonalności deserializacji:

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 
} 

W przypadku XML - tutaj jest przykładem niestandardowego serializacji: http://geekswithblogs.net/marcel/archive/2006/05/19/78989.aspx

+0

Czy to nie jest 'BinaryFormetter'? xml jest zwykle "IXmlSerializable", który wygląda * bardzo * inaczej. –

+0

Tak, Mark, masz rację, ale IXmlSerializable można również łatwo rozszerzyć za pomocą metody ReadXml. –

+1

Więc jak bym to zrobił? Naprawdę noob z tym, ponieważ zrobiłem tylko regularne deserialization (deserialize cały obiekt) i używane tylko XmlIgnore. Szukałem na MSDN, jak z tego korzystać, ale było to dość skomplikowane i nie mogłem dostać się do pracy (czasami nienawidzę MSDN za ich zbyt skomplikowane przykłady). – Carlo

0

Mówisz o deserializacji xml jak jest analizowany, abyś nie musiał ładować całego pliku xml do pamięci, czy deserializować go podczas próby uzyskania dostępu do konkretnego obiektu?

To może pomóc spojrzeć na implementacji SAX w przeciwieństwie do DOM:

http://www.saxproject.org/

+0

Potrzebuję deserializować obiekt MyObject, ale nie obiekt ArrayOfOtherObject. A później, jeśli zażąda tego użytkownik, będę musiał załadować ArrayOfOtherObject, ale początkowo tylko MyObject. – Carlo

+0

Inną myślą jest, że RDBMS byłby lepiej przystosowany do przechowywania i pobierania tych danych w wymagany przez ciebie sposób. Możesz zaimportować te dane do relacyjnej bazy danych, a następnie przesłać je za pomocą LINQ do SQL (na przykład, gdy pamiętam, używam leniwego ładowania). – PabloC