我有一个班级:
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”。
这可能吗?
答案 0 :(得分:28)
不,这是不可能的。序列化程序在反序列化时创建对象。你已经创建了一个对象。相反,提供一个静态方法来从XDocument构造。
public static MyClass FromXml (XDocument xd)
{
XmlSerializer s = new XmlSerializer(typeof(MyClass));
return (MyClass)s.Deserialize(xd.CreateReader());
}
答案 1 :(得分:6)
使用静态加载方法更为标准。
public class MyClass
{
public static MyClass Load(XDocument xDoc)
{
XmlSerializer _s = new XmlSerializer(typeof(MyClass));
return (MyClass)_s.Deserialize(xDoc.CreateReader());
}
}
答案 2 :(得分:4)
最好使用某种工厂,例如:
public static MyClass Create(XDocument xd)
{
XmlSerializer _s = new XmlSerializer(typeof(MyClass));
return (MyClass)_s.Deserialize(xd.CreateReader());
}
答案 3 :(得分:1)
我想做同样的事情并决定做以下事情:
config.vm.network "forwarded_port", guest: 3001, host: 3001
答案 4 :(得分:-1)
你的问题的简单答案是否定的,你不能。因此,原因是您在反序列化时创建了一个对象。
但是如果你真的坚持对象实例化自己的可能性,你可以使用私有静态实例变量,你可以用反序列化后得到的对象加载它。然后其他公共成员应该处理该实例(当它不是null时)
一个例子(从我的脑子里出来,所以它有可能不完全正确):
public class MyClass
{
private XmlSerializer _s = new XmlSerializer(typeof(MyClass));
private static MyClass mInstance = null;
public MyClass() { /* initialization logic */ }
public MyClass(XDocument xd)
{
mInstance = (MyClass)_s.Deserialize(xd.CreateReader());
}
public void DoSomething()
{
if (mInstance != null)
mInstance.DoSomething();
else
{
// logic for DoSomething
}
}
}
我希望这有点清楚,但我不喜欢这样的设计。我认为这使得它过于复杂且对错误敏感。