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[] EQs的权利Type

于 2013-10-08T11:35:43.363 回答