C# 如何使用接受XDocument的构造函数将XML反序列化为对象?
我有一门课:C# 如何使用接受XDocument的构造函数将XML反序列化为对象?,c#,.net,xml,xml-serialization,linq-to-xml,C#,.net,Xml,Xml Serialization,Linq To Xml,我有一门课: public class MyClass { public MyClass(){} } 我希望能够使用XMLSeralizer直接在构造函数中反序列化XDocument,因此: public class MyClass { private XmlSerializer _s = new XmlSerializer(typeof(MyClass)); public MyClass(){} public MyClass(XDocument xd) {
public class MyClass
{
public MyClass(){}
}
我希望能够使用XMLSeralizer直接在构造函数中反序列化XDocument,因此:
public class MyClass
{
private XmlSerializer _s = new XmlSerializer(typeof(MyClass));
public MyClass(){}
public MyClass(XDocument xd)
{
this = (MyClass)_s.Deserialize(xd.CreateReader());
}
}
除非我不允许在构造函数中指定“this”
这可能吗?不,不可能。序列化程序在反序列化时创建对象。您已经创建了一个对象。相反,提供一个从XDocument构造的静态方法
public static MyClass FromXml (XDocument xd)
{
XmlSerializer s = new XmlSerializer(typeof(MyClass));
return (MyClass)s.Deserialize(xd.CreateReader());
}
使用静载荷法更为标准
public class MyClass
{
public static MyClass Load(XDocument xDoc)
{
XmlSerializer _s = new XmlSerializer(typeof(MyClass));
return (MyClass)_s.Deserialize(xDoc.CreateReader());
}
}
最好使用某种工厂,例如:
public static MyClass Create(XDocument xd)
{
XmlSerializer _s = new XmlSerializer(typeof(MyClass));
return (MyClass)_s.Deserialize(xd.CreateReader());
}
我也想做同样的事情,并决定做以下事情:
public class MyClass
{
public MyClass(){
}
public MyClass(XDocument xd)
{
var t = typeof(MyClass);
var o = (MyClass)new XmlSerializer(t).Deserialize(xd.CreateReader());
foreach (var property in t.GetProperties())
property.SetValue(this, property.GetValue(o));
}
}
你为什么要这样做?因为实例化这个类并给它提供一个XDocument并让它自己像那样设置会很好。还有其他的解决方案,但对我来说这似乎是最优雅的。。。我愿意接受更好的建议。难道你不能将类设置为将数据序列化到其中,从而为你创建实例吗?当外部类型(knownTypes)在编译时未知时,你应该怎么做?这太糟糕了,在开始反序列化之前,我们甚至没有对init进行预回调?