如何使用带有XDocument的构造函数将XML反序列化为对象?

时间:2011-10-26 10:41:23

标签: 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)
   {
      this = (MyClass)_s.Deserialize(xd.CreateReader());
   }
}

除了我不允许在构造函数中指定“this”。

这可能吗?

5 个答案:

答案 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
     }

  }
}

我希望这有点清楚,但我不喜欢这样的设计。我认为这使得它过于复杂且对错误敏感。