2009-10-15 69 views
6

所以我有一个具有类似的结构,以这一个xml:C#部分反序列化

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

有没有我可以反序列化的MyObject但不是ArrayOfOtherObject的方法吗?然后稍后在需要时对ArrayOfOtherObject执行延迟加载?

我通常使用XmlDeserialization,但AFAIK它总是加载整个事情。

谢谢!

+2

说实话,除非数据量是巨大的,你会过得更好去为最简单的方法,和反序列化这一切。 – 2009-10-15 15:39:53

+0

+1好问题Carlo – toddmo 2013-12-09 16:33:06

回答

2

您可以使用特殊的构造是由二进制反序列化功能的认识:

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 
} 

在XML的情况下 - 这里是自定义序列化的一个例子: http://geekswithblogs.net/marcel/archive/2006/05/19/78989.aspx

+0

是不是'BinaryFormetter'? xml通常是'IXmlSerializable',它看起来非常不同。 – 2009-10-15 15:31:58

+0

是的,马克,你是对的,但IXmlSerializable也可以很容易地通过ReadXml方法进行扩展。 – 2009-10-15 15:35:36

+1

那么我会怎么做呢?我真的很喜欢这个,因为我只做了常规的反序列化(反序列化整个对象),只使用了XmlIgnore。我在MSDN上搜索如何使用它,但它很复杂,无法工作(有时我讨厌他们过于复杂的MSDN例子)。 – Carlo 2009-10-15 15:45:22

0

你是在说反序列化XML因为它被解析,所以你不必将整个xml文件加载到内存中,或者在你试图访问具体对象时将其反序列化?

这可能有助于看看SAX的实现,而不是DOM:

http://www.saxproject.org/

+0

我需要反序列化MyObject,但不是ArrayOfOtherObject。稍后如果用户请求,我将需要加载ArrayOfOtherObject,但最初只是MyObject。 – Carlo 2009-10-15 15:35:28

+0

另一个想法是,RDBMS将更适合以您需要的方式存储和检索这些数据。您可以将这些数据导入到关系数据库中,然后使用LINQ to SQL进行查询(我记得使用了延迟加载)。 – PabloC 2009-10-16 08:13:08