gpt4 book ai didi

c# - 由于 dll 不同,克隆/序列化会产生错误的类

转载 作者:太空宇宙 更新时间:2023-11-03 14:00:32 25 4
gpt4 key购买 nike

我有一个类为 Execution 的 dll 库 TaskLibrary.dll表演一些 Operation (s) 和一类 ParallelizeExecution需要一个Execution , 克隆它并执行 Run倍数的方法Execution实例。

Clone Execution 的方法类通过转换 Execution 来工作在 xml 中并将其恢复为正常的新实例

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 的类也是如此.这是通过使用抽象类(AOperation)获得的,所有IOperation实现扩展,使用 XmlInclude注释 MyXmlSerializer为每个人工作 IOperation .

[XmlInclude(typeof(Operation1))]
[XmlInclude(typeof(Operation2))]
public abstract class AOperation:IOperation{
...
}

现在我有一个引用 TaskLibrary.dll 的新项目。我需要向 Execution 添加一种新的操作:

public class Operation3: Operation2 {
}

单次执行一切正常,但当我使用 ParallelizeExecutionOperation3正确序列化为 Operation2从而执行不需要的 Run方法。如何添加新类型的 AOperationExecution类并期望它被正确序列化并在 Execution 中运行?

如何在不改变 Execution 的方式的情况下避免这个问题?类被序列化了吗?

警告:我知道可以使用反射对任何扩展给定的 tipe 进行 xmlserialize,但我宁愿学习如何使用标准 OOP(如果可能)来做到这一点。

编辑: 我可以修改 TaskLibrary.dll,但我宁愿避免这种方法,它会使我学习新事物和帮助社区的努力付之东流,而且重新分发图书馆给那些已经在使用它的人。

最佳答案

您可以使用 XmlSerializer constructor 的 extraTypes 参数.使用反射查找所有相关类型,并使用完整列表创建 XmlSerializer。整体流程布局here ,但为了后代:

// use reflection to get all derived types
List<type> knownTypes = new List<type>();

// Iterate over whichever assembly has your types.
foreach(Type t in Assembly.GetExecutingAssembly().GetTypes())
if (typeof(Car).IsAssignableFrom(t) ||
typeof(Wheel).IsAssignableFrom(t) ||
typeof(Door).IsAssignableFrom(t))
knownTypes.Add(t);

// prepare to serialize a car object
XmlSerializer serializer = new XmlSerializer(typeof(Car), knownTypes.ToArray());

关于c# - 由于 dll 不同,克隆/序列化会产生错误的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10835026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com