.net – xml字符串的一般反序列化

前端之家收集整理的这篇文章主要介绍了.net – xml字符串的一般反序列化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一堆不同的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);
}

但是,这只会给你一个对象…如果所有类型的实现一个通用的接口,你可以反序列化如上,但将返回类型更改为接口(并在返回语句中转换)

猜你在找的XML相关文章