下面的例子告诉我“[One xmlns =”]不是预期的.”例外
public abstract class BaseClass{ }
[XmlRoot("One")]
public class ChildOne : BaseClass {}
[XmlRoot("Two")]
public class ChildTwo : BaseClass { }
class Program
{
private static void Main(string[] args)
{
var ser = new XmlSerializer(typeof (BaseClass), new Type[] {typeof (ChildOne), typeof (ChildTwo)});
var obj1 = ser.Deserialize(new StringReader(@"<?xml version=""1.0""?><One></One>"));
var obj2 = ser.Deserialize(new StringReader(@"<?xml version=""1.0""?><Two></Two>"));
}
}
我需要反序列化XML(不是由我生成的).根标签可能有不同的名称,我必须映射到不同的类.
PS.我知道有很多这样的问题.我研究过它们但我的问题仍未解决.
解决方法:
我的问题没有大肆宣传.社区可能会认为这只是一个白痴问的另一个愚蠢的问题.他们可能是对的.我必须自己回答,但要注意:答案也可能是愚蠢的.
我最终探测了XML的根元素,然后将其映射到一种已知类型并使用该类型进行反序列化.像这样:
public abstract class BaseClass{ }
[XmlRoot("One")]
public class ChildOne : BaseClass {}
[XmlRoot("Two")]
public class ChildTwo : BaseClass { }
class Program
{
private static void Main(string[] args)
{
var kNown = new Type[] {typeof (ChildOne), typeof (ChildTwo)};
var obj1 = Deserialize<BaseClass>(@"<?xml version=""1.0""?><One></One>", kNown);
var obj2 = Deserialize<BaseClass>(@"<?xml version=""1.0""?><Two></Two>", kNown);
}
private static T Deserialize<T>(string xml, Type[] kNownTypes)
{
Type roottype = typeof (T);
if (kNownTypes.Any())
{
using (var reader = XmlReader.Create(new StringReader(xml)))
{
reader.MovetoContent();
roottype = (from kt in kNownTypes
let xmlRoot = kt.GetCustomAttributes<XmlRootAttribute>().FirstOrDefault()
where kt.Name == reader.Name || (xmlRoot != null && xmlRoot.ElementName == reader.Name)
select kt).FirstOrDefault() ?? typeof(T);
}
}
return (T) new XmlSerializer(roottype, kNownTypes).Deserialize(new StringReader(xml));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。