【发布时间】:2012-05-31 13:52:45
【问题描述】:
我有一个 dll 库 TaskLibrary.dll,其中一个类 Execution 执行一些 Operation(s) 和一个类 ParallelizeExecution,它采用单个 Execution,克隆它并执行 Run 方法多个Execution 实例。
Execution 类的 Clone 方法通过在 xml 中转换 Execution 并将其恢复为正常的新实例来工作
public Execution{
List<AOperation> operations;
public Run(){
foreach(var op in operations){
//...do stuff...
}
}
public Execution Clone(){
MyXmlSerializer.DeserializeObject<Execution>(
MyXmlSerializer.SerializeObject(this));
}
}
public ParallelizeExecution{
List<Execution> toRun;
public RunParallel(Execution e,int numExecutions){
toRun=new List<Execution>();
for(var i=0;i<numExecutions;i++){
toRun.Add(e.Clone());
}
}
}
Execution 类是可序列化的,每个实现Operation 的类也是如此。这是通过使用所有IOperation 实现扩展的抽象类(AOperation) 获得的,使用XmlInclude 注释使MyXmlSerializer 为每个IOperation 工作。
[XmlInclude(typeof(Operation1))]
[XmlInclude(typeof(Operation2))]
public abstract class AOperation:IOperation{
...
}
现在我有一个引用 TaskLibrary.dll 的新项目。我需要向Execution 添加一种新的操作:
public class Operation3: Operation2 {
}
单次执行一切正常,但是当我使用ParallelizeExecution 时,Operation3 被正确序列化为Operation2,因此执行了不需要的Run 方法。如何将新类型的AOperation 添加到Execution 类并期望它被正确序列化并在Execution 中运行?
或
如何在不改变Execution 类的序列化方式的情况下避免该问题?
警告:我知道可以使用反射来对任何扩展给定的提示进行 xmlserialize,但我宁愿学习如何使用标准 OOP(如果可能)来做到这一点。
编辑:我可以修改TaskLibrary.dll,但我宁愿避免这种方法,它会浪费我学习新事物和帮助社区的努力,而且重新分配会很痛苦图书馆给那些已经在使用它的人。
【问题讨论】:
标签: c# generics xml-serialization