C# 如何反序列化为动态类型
我试图反序列化XML以获得动态创建的类型数组(使用codedom),然后使用反射加载该程序集并加载动态创建的类型。当我尝试反序列化我的XML(它有一个动态生成类型的对象集合)时,我不确定如何向序列化程序提供该类型 我的代码示例:C# 如何反序列化为动态类型,c#,xml,serialization,C#,Xml,Serialization,我试图反序列化XML以获得动态创建的类型数组(使用codedom),然后使用反射加载该程序集并加载动态创建的类型。当我尝试反序列化我的XML(它有一个动态生成类型的对象集合)时,我不确定如何向序列化程序提供该类型 我的代码示例: Assembly assembly = Assembly.LoadFile("myDynamicassembly.dll"); Type type = assembly.GetType("myDynamicType");
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”。它将在运行时创建和编译
请提供帮助。这里的技巧是
类型的实例上的Type.MakeArrayType()
方法。无参数版本生成向量类型,即typeof(Foo).MakeArrayType()
==typeof(Foo[])
。多维数组等还有其他重载
XmlSerializer serializer = new XmlSerializer(type.MakeArrayType());
然而:你将无法在最后施展它;您需要使用object[]
或类似工具(使用引用类型的数组变量):
我不知道我要说的是否是你想要的,但是:
不能将其反序列化为对象类型吗
object[] EQs;
XmlSerializer serializer = new XmlSerializer(typeof(object[]));
EQs = (object[])(serializer.Deserialize(reader));
如果对象类型是在编译时定义的(如您所说),那么不应该有一些代码来定义它吗?在这段代码中,您只需将对象转换为您想要的类型
拥有对象[]eq
后,另一种转换方法如下:
if(EQs.Lenght > 0)
{
Type t = EQs[0].GetType();
}
现在使用获得的类型
将您的对象[]eq
转换为右侧的类型
您知道编译时的类型吗,还是正在加载完全未知的程序集?你打算如何使用这些对象?不,我不知道编译时的类型。实际上,它将在运行时生成并编译为程序集。因此,可以说我的程序集和我的“myDynamicType”在编译时都是完全未知的。至于进一步的使用,我将把这个数组传递给我的web服务,它将对这个集合执行一些操作。谢谢Marc。但是,如果我将其强制转换为对象[],我将无法将其传递给需要特定类型集合的web服务。@AshishAgrawal如果该类型是动态加载的,您已经遇到了问题。无论您如何键入,它基本上都是该类型的。如果类型是静态已知的,那么坦率地说,所有这些都是毫无意义的。类型不是静态定义的。实际上,正如我所说,我正在使用codedom创建“myDynamicType”。因此,这个字符串是一个变量,它会根据用户的一些输入而改变。例如,若用户说我想创建一个学生类,那个么我的代码将更改为:Student[]EQs;XmlSerializer serializer=新的XmlSerializer(typeof(Student[]);EQs=(学生[])(序列化程序.反序列化(读取器));请让我知道我是否在这里制造了任何混乱。@AshishAgrawal问题是最后一点-等式。对于一个不是(也不能)静态类型的变量,很难做任何有用的事情。您需要使用反射或动态。让我试着在这里解释我的确切要求。我有一个web服务,它根据客户机提供的信息(通过url)动态生成wsdl。例如,如果用户试图访问“myServiceHost/myWebService/A.asmx?wsdl”;然后wsdl显示了一些方法,如GetA(A[]records)、CreateA(A[]records)、DeleteA(A[]records)等,其中A将是可序列化的类型。假设用户尝试并访问url myServiceHost/myWebService/B.asmx?wsdl,那么它将显示一些方法,如GetB(B[]记录)、CreateB(B[]记录)、DeleteB(B[]记录)contd“您不能将其反序列化为对象类型吗”-基本上没有XmlSerializer
需要知道它应该做什么expect@Vincent,实际上我正在使用codedom动态(在运行时)创建该类型。下面是我在运行时获取类型的代码(基于用户的输入)。Type Type=assembly.GetType(“myDynamicType”);因此,myDynamicType不是静态定义的类型。那么它可以是什么类型呢?我们谈论的可能是字符串,也可能是数字。也可以是定制的。更重要的是,你需要用它来计算/做一些事情吗?如果只是为了从xml加载以在屏幕上显示somewere,一个字符串就足够了。@Vincentadvocat它可以是任何自定义类型,并将包含多个方法(请参阅我对上面Marc答案的评论)。我将把这个集合传递给我的web服务(对该集合执行一些操作)。
if(EQs.Lenght > 0)
{
Type t = EQs[0].GetType();
}