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

One*_*key 11 .net c# xml xml-serialization linq-to-xml

我有一节课:

public class MyClass
{
   public MyClass(){}
}
Run Code Online (Sandbox Code Playgroud)

我希望能够使用XMLSeralizer直接在构造函数中反序列化XDocument:

public class MyClass
{
   private XmlSerializer _s = new XmlSerializer(typeof(MyClass));

   public MyClass(){}
   public MyClass(XDocument xd)
   {
      this = (MyClass)_s.Deserialize(xd.CreateReader());
   }
}
Run Code Online (Sandbox Code Playgroud)

除了我不允许在构造函数中指定"this".

这可能吗?

Tim*_*ers 29

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

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


Ray*_*Ray 6

使用静态加载方法更为标准.

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


Kir*_*huk 5

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

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