2011-05-03 56 views
0

假设我们有一个业务对象,我们称之为Foo,其中包含一个有序列表Bar s。我们通过这个Foo作为XML。如何将持久内容传递给开发消费类的开发人员

我们有反序列化本身使用其反序列化子Bar XML节点(BarXMLDeserializer)一类Foo XML节点(FooXMLDeserializer)一类。现在

,我增加了一些功能,以维护某些状态,使得如果FooXMLDeserializer是在两个不同的Foo节点调用时没有正在重置的BarXMLDeserializer的状态,其结果可能是无效的BarXMLDeserializerBarXMLDeserializer不知道它何时处理Foo中的最终Bar

有没有什么方法可以设计BarXMLDeserializer类,以便与开发人员进行通信,以便消耗具有状态的类,并且必须对每个Foo进行重置?

进一步信息:

  • 我的改变解决了我们的代码未成年足够的问题,我无法说服我的经理让我花X天重新设计整个系统很好地处理了这案件。
  • 重要的是,BarXMLDeserializer保持在BarStateTracker类中,它是内部的类。
  • 在C#中编程,但寻找更通用的解决方案。

谢谢。

回答

3

暴露你的序列化仅作为一个静态方法:

// no public constructor, etc 
var deserializer = BarXMLDeserializer.CreateNew(); 

然后,当你完成反序列化的数据,你的对象标记的字段。如果该字段已设置,则在调用反序列化方法时,如果使用同一实例反序列化更多数据,则会抛出异常。

if(IsInstanceExhausted) 
    throw new InvalidOperationException("You must use a fresh instance."); 

他们会在他们第一次例外之后找出结果。此外,将您的班级标记为IDisposable,以便代码自然使用使用语句:

using(var deserializer = BarXMLDeserializer.CreateNew()) 
{ 
} 

该列表还有其他方法。 或者,您可以简单地设计您的Deserializer,以在反序列化尝试后清除它的状态或重置,或者在反序列化尝试开始时清除状态。