【问题标题】:How do I deserialize XML into an object using a constructor that takes an XDocument?如何使用采用 XDocument 的构造函数将 XML 反序列化为对象?
【发布时间】:2011-12-15 15:19:14
【问题描述】:

我有一堂课:

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 并让它自己设置这样会很好。还有其他解决方案,但这对我来说似乎最优雅......我愿意接受更好的建议。
  • 您不能设置类以将数据序列化到其中,从而为您创建实例吗?

标签: c# .net xml xml-serialization linq-to-xml


【解决方案1】:

不,这是不可能的。序列化程序在反序列化时创建对象。您已经创建了一个对象。相反,提供从 XDocument 构造的静态方法。

public static MyClass FromXml (XDocument xd)
{
   XmlSerializer s = new XmlSerializer(typeof(MyClass));
   return (MyClass)s.Deserialize(xd.CreateReader());
}

【讨论】:

  • 以及当编译时不知道额外类型(knownTypes)时你应该怎么做?这太邪恶了,在开始反序列化之前我们甚至没有对 init 东西的预回调?
【解决方案2】:

使用静态加载方法更标准。

public class MyClass
{
    public static MyClass Load(XDocument xDoc)
    {
        XmlSerializer _s = new XmlSerializer(typeof(MyClass));
        return (MyClass)_s.Deserialize(xDoc.CreateReader());
    }
}

【讨论】:

    【解决方案3】:

    最好使用某种工厂,例如:

    public static MyClass Create(XDocument xd)
    {
        XmlSerializer _s = new XmlSerializer(typeof(MyClass));
        return (MyClass)_s.Deserialize(xd.CreateReader());
    }
    

    【讨论】:

      【解决方案4】:

      我想做同样的事情并决定做以下事情:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多