如何反序列化为动态类型

时间:2013-10-08 11:06:58

标签: c# xml serialization

我正在尝试反序列化我的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”。它将在运行时创建和编译。

请帮忙。

2 个答案:

答案 0 :(得分:9)

这里的诀窍是Type.MakeArrayType()实例上的Type方法。无参数版本生成 vector 类型,即typeof(Foo).MakeArrayType() === typeof(Foo[])。多维数组等还有其他重载。

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

但是:你能够在最后投出它;您将需要使用object[]或类似的(使用引用类型的数组方差):

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

答案 1 :(得分: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();
     }

现在使用获得的Typeobject[] EQs转换为右Type