7

XML を逆シリアル化して動的に作成された型の配列を取得しようとしています (codedom を使用)。その後、リフレクションを使用してそのアセンブリを読み込み、動的に作成された型を読み込みます。XML (この動的に生成された型のオブジェクトのコレクションを持っている) を逆シリアル化しようとすると、型をシリアライザーに提供する方法がわかりません。

私のコードサンプル:

        Assembly assembly = Assembly.LoadFile("myDynamicassembly.dll");
        Type type = assembly.GetType("myDynamicType");

        string xmlstring = myXml.OuterXml.ToString();
        byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlstring);
        MemoryStream ms = new MemoryStream(buffer);
        XmlReader reader = new XmlTextReader(ms);

        myDynamicType[] EQs;
        XmlSerializer serializer = new XmlSerializer(typeof(myDynamicType[]));
        EQs = (myDynamicType[])(serializer.Deserialize(reader));

だから、ここでの問題は、コードを書いているときに「myDynamicType」がわからないことです。実行時に作成およびコンパイルされます。

助けてください。

4

2 に答える 2

9

ここでの秘訣は、Type.MakeArrayType()のインスタンスに対するメソッドですType。パラメーターなしのバージョンでは、ベクター型、つまりtypeof(Foo).MakeArrayType()===が生成されますtypeof(Foo[])。多次元配列などには他にもオーバーロードがあります。

XmlSerializer serializer = new XmlSerializer(type.MakeArrayType());

ただし、最後にキャストすることはできません。または同様のものを使用する必要がありますobject[](参照型の配列分散を使用):

EQs = (object[])(serializer.Deserialize(reader));
于 2013-10-08T11:11:15.720 に答える
0

私が言おうとしていることがあなたの望むものかどうかはわかりませんが、

オブジェクト型としてデシリアライズできませんか

object[] EQs;
XmlSerializer serializer = new XmlSerializer(typeof(object[]));
EQs = (object[])(serializer.Deserialize(reader));

オブジェクト型がコンパイル時に定義されている場合 (あなたが言うように)、それを定義するコードが少しあるはずではありませんか? そのコードでは、オブジェクトを必要な型に変換するだけですか?

変換する別の方法object[] EQsは、次のとおりです。

     if(EQs.Lenght > 0)
     {
        Type t = EQs[0].GetType();
     }

そして今、得たものを使ってあなたを右Typeに変換しますobject[] EQsType

于 2013-10-08T11:35:43.363 に答える