我有一堆不同的DTO课程.它们在一段时间内被序列化成一个
XML字符串,并且镜像到网络应用程序的客户端.现在当客户端回放一个XML字符串时,我需要将其反序列化为它所代表的DTO类的一个实例.问题是我想使它成为通用的,可能是一个接收xml字符串并且吐出一个类型的对象的函数.像这样的长长的东西:
public sometype? Deserialize (string xml) { //some code here return objectFromXml; }
编辑:可怕的例子!我只是自相矛盾!
我不能做以下事情:
Person person = Deserialize(personXmlStringFromClient);
因为我不知道personXmlStringFromClient是Person DTO对象实例的表示.
我不知道是什么序列化对象给了我,这似乎是我的问题.我一直在阅读关于反射和其他技术,其中涉及将类型粘贴到xml中,以使解串器知道如何处理它.我似乎无法将它们整合在一起,成为一件工作.另外,在大多数例子中,作者知道反序列化后将会有什么类型的.欢迎任何建议!如果我需要做一些特别的序列化过程,请分享.
你可以使用通用的:
public T Deserialize<T>(string input) where T : class { System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T)); using (StringReader sr = new StringReader(input)) return (T)ser.Deserialize(sr); }
如果你不知道它会是哪种类型,我假设你有一个固定数量的可能的类型,你可以尝试反序列化到每一个,直到你没有遇到异常.不是很好,但它会奏效.
或者,您可以检查外部对象名称的xml的开始,并希望能够从那里确定类型.这将取决于xml的外观.
编辑:根据您的编辑,如果调用者知道他们正在传递的类型,他们能否提供完全限定的类型名称作为字符串作为服务的附加参数?
如果是这样,你可以这样做:
Type t = Type.GetType(typeName);
并将Deserialize方法改为如下:
public object Deserialize(string input,Type toType) { System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(toType); using (StringReader sr = new StringReader(input)) return ser.Deserialize(sr); }
但是,这只会给你一个对象…如果所有类型的实现一个通用的接口,你可以反序列化如上,但将返回类型更改为接口(并在返回语句中转换)