2013-10-08 4 views
6

動的に(codedomを使用して)作成された型の配列を取得するためにXMLをデシリアライズしようとしています。その後、リフレクトを使用してそのアセンブリをロードし、動的に作成されます。私は(この動的に生成された型のオブジェクトのコレクションを持っている)私の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」を知らないということです。実行時に作成され、コンパイルされます。

助けてください。

+0

に変換し得Typeを使用しますが、コンパイル時でのタイプを知っていますかでも、まったく不明なアセンブリを読み込んでいますか?どのようにこれらのオブジェクトを使用するつもりですか? –

+0

いいえ、コンパイル時に型がわかりません。実際には、生成され、実行時にアセンブリにコンパイルされます。つまり、私のアセンブリだけでなく、私の 'my​​DynamicType'も、コンパイル時に全く知られていないと言うことができます。さらなる使用については、この配列をWebサービスに渡して、このコレクションで何らかの操作を実行します。 – tavier

答えて

8

Type.MakeArrayType()のメソッドは、Typeのインスタンスです。パラメータのないバージョンはベクトルタイプ、つまりtypeof(Foo).MakeArrayType() === typeof(Foo[])を生成します。

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

しかし多次元配列などのために他のオーバーロードがあります:あなたはない最後にそれを唱えることができるようになります。

EQs = (object[])(serializer.Deserialize(reader)); 
+0

ありがとうMarc。しかし、オブジェクトにキャストすると、特定の型のコレクションを必要とするWebサービスに渡すことができなくなります。 – tavier

+0

@AshishAgrawalタイプが動的にロードされている場合は、既にそこに問題があります。どのように入力しても基本的に*そのタイプのものです。タイプが静的に分かっているなら、率直に言えば、これはすべて無意味です。 –

+0

タイプが静的に定義されていません。実際には、私が言ったように、私は "myDynamicType"を作成するためにコード化を使用しています。したがって、この文字列は、ユーザーからの入力に基づいて変更される変数です。たとえば、ユーザーが私がStudentクラスを作成したいと言うと、私のコードはStudent [] EQsのように変わります。 XmlSerializerシリアライザ=新しいXmlSerializer(typeof(Student [])); EQs =(Student [])(serializer.Deserialize(reader));私がここに混乱を起こしているかどうか教えてください。 – tavier

0

私は何を言おうとしてることは、あなたが望むものであるならば、私は知らないが:あなたが(参照型の配列分散を使用して)object[]または類似を使用する必要があります

することができます」オブジェクト型は、コンパイル時に定義されている場合は、オブジェクト型

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

としてそれをデシリアライズT(あなたが言うように)それを定義するコードのビットが存在してはなりませんか?そのコードで目的のタイプにオブジェクトを変換するだけですか?あなたのobject[] EQsを持っていたら、変換する

他の方法は次のとおりです。今

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

とあなたのobject[] EQsが右Type

+1

"あなたはオブジェクト型として逆シリアル化できません" - いいえ、基本的には、 'XmlSerializer'は、何を期待すべきかを知る必要があります。 –

+0

@Vincent、実際には、(実行時に)コード化された型を使ってその型を動的に作成しています。ここで、実行時に(ユーザーからの入力に基づいて)型を取得するコードを示します。タイプtype = assembly.GetType( "myDynamicType");したがって、myDynamicTypeは静的に定義された型ではありません。 – tavier

+0

それはどのようなタイプにすることができますか?私たちはそれについて話しています。それともカスタムクラッシュかもしれません。 より重要なことは、それを計算する/しなければならないことですか? xmlから画面上に表示するためにロードするだけの場合は、文字列で十分です。 – Vincent

関連する問題