2

Executionいくつかのクラスを実行OperationするクラスParallelizeExecutionと、単一のクラスを取得してExecutionクローンを作成しRun、複数のExecutionインスタンスのメソッドを実行するdllライブラリTaskLibrary.dllがあります。

クラスのCloneメソッドは、 xmlをExecution変換し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クラスは、を実装する各クラスと同様にシリアライズ可能ですOperationAOperationこれは、すべてのIOperation実装が拡張する抽象クラス( )を使用し、XmlIncludeアノテーションを使用しMyXmlSerializerてそれぞれに対して機能することによって取得されますIOperation

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

これで、TaskLibrary.dllを参照する新しいプロジェクトができました。Execution新しい種類の操作を:に追加する必要があります。

public class Operation3: Operation2 {
}

1回の実行ですべてが正常に機能しますが、使用すると、不要なメソッドを実行するようParallelizeExecution Operation3に正しくシリアル化されます。クラスに新しいタイプを追加して、正しくシリアル化されて実行されることを期待するにはどうすればよいですか?Operation2RunAOperationExecutionExecution

また

Executionクラスのシリアル化方法を変更せずに問題を回避するにはどうすればよいですか?

警告:Reflectionを使用して、特定のヒントを拡張する任意のヒントをxmlserializeすることが可能であることは知っていますが、標準のOOPを使用してこれを行う方法を学びたいと思います(可能な場合)。

編集: TaskLibrary.dllを変更することはできますが、このアプローチは避けたいと思います。新しいことを学び、コミュニティを支援する努力が無効になります。さらに、ライブラリをすでに使用しているユーザーに再配布するのは非常に苦痛です。

4

1 に答える 1

1

XmlSerializer コンストラクターに extraTypes 引数を使用できます。リフレクションを使用して関連するすべての型を見つけ、完全なリストで XmlSerializer を作成します。全体的なプロセスはここに配置されていますが、後世のために:

// 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());
于 2012-05-31T15:18:37.990 に答える