我想用不同的类型反序列化我的XML字符串,该方法将有字符串作为输入参数,它将接受5种类型的XML字符串。
目前,我的计划是根据string.StartsWith方法选择要反序列化XML String的类来查找类型。
有没有更好的方法来找到要反序列化的类的类型?
发布于 2016-06-29 10:18:48
我的第一个建议是允许用户在输入时选择类型,这样您就不必读取字符串来查找类型。
但是,如果你真的真的想这样做,你可以这样做。出于测试的目的,我序列化了一个名为MyClass的类。我很有创意。
var input = @"<MyClass xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""><MyString>Scott</MyString></MyClass>";
var xml = new XmlDocument();
xml.LoadXml(input);
//xml could be null
//Get the tag name of the root element which is
//the name of the serialized type.
var typeName = xml.DocumentElement.Name;
//Try to create a type from that root element's name.
var type = Type.GetType(typeName);
//If it doesn't match a type then it will be null.
if (type != null)
{
//create an XmlSerializer for that type and deserialize the string.
var serializer = new XmlSerializer(type);
using (var sr = new StringReader(input))
{
var deserialized = serializer.Deserialize(sr);
}
}它将执行您指定的操作。但是现在,正如您开始时输入的字符串可以是几个可能的类的序列化一样,现在您得到了一个object (deserialized),它也是非类型化的,所以我不太确定您下一步会如何处理它。
发布于 2016-06-30 22:54:20
如果你在问是否有一种优雅的方法来根据字符串推断c#类型,那么我的答案是“不是真的”。您必须使用自己喜欢的机制来检查输入字符串,以便从字符串内容中推断出类型。
或者干脆不关心输入是什么“类型”,而是使用xmldocument上的xpath来完成您的工作。
我最喜欢的c#类类型检测机制如下所示:
internal class Converter
{
public T CovertXML<T>(string XMLString) where T:class
{
if (XMLString.ToLower().Contains(typeof(Type1).GetType().Name.ToLower()))
{
return XMLString.Deseralize<Type1>() as T;
}
//..etc etc.
return null;
}
}
internal class Type1
{
}
public static class StringExtensionMethods
{
public static T Deseralize<T>(this string Instance)
{
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));
using (System.IO.StringReader sr = new System.IO.StringReader(Instance))
return (T)ser.Deserialize(sr);
}
}https://stackoverflow.com/questions/38088849
复制相似问题