繁体   English   中英

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

[英]How do I deserialize XML into an object using a constructor that takes an XDocument?

我有一节课:

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));
   }
}

你的问题的简单答案是否定的,你不能。 因此,原因是您在反序列化时创建了一个对象。

但是如果你真的坚持对象实例化自己的可能性,你可以使用私有静态实例变量,你可以用反序列化后获得的对象加载它。 然后其他公共成员应该在实例上工作(当它不是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
     }

  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM