我正在尝试反序列化我的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”。它将在运行时创建和编译。
请帮忙。
答案 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();
}
现在使用获得的Type
将object[] EQs
转换为右Type