将XML从一个类反序列化为一个新类,而不在项目中使用旧类

时间:2016-03-24 19:00:15

标签: c# xml serialization

我有一个项目,其中包含一个获取XML序列化的类,并且该类具有另一个类类型的属性。我想删除这个类,并将另一个类(属性类)移动到一个新项目,同时更改属性类及其子类的结构(添加新属性,删除旧属性,重命名等) 。我知道如果我只是移动一个类,我可以在我的类上使用XmlType属性来将现有对象反序列化到新的类/项目/程序集中,但是这个工作流似乎比这更复杂。有可能吗?

下面的一些示例代码。

我要删除的旧类:

[XmlInclude(typeof(BaseStyle))]
[XmlInclude(typeof(MyStyle))]
[XmlInclude(typeof(YourStyle))]
public class Node
{
   public BaseStyle Style {get;set;}
   // More stuff, most of it irrelevant
}

BaseStyle类及其子项定义为

public class BaseStyle
{
   public string Description = string.Empty;
}

public class MyStyle : BaseStyle
{
   public double Factor1 = 1.0;
   public double Factor2 = 2.0;
}

public class YourStyle : BaseStyle
{
   public double Constant = 10.0;
   public DefaultValuesClass DefaultValues = null;
}

因此,所有这些都被序列化为XML,并且生成的XML看起来像

<Node>
   <Style p2:type="YourStyle" xmlns:p2="blah">
      <Constant>5.0</Constant>
      <DefaultValues>
       // XML for the DefaultValuesClass class here
      </DefaultValues>
   </Style>
</Node>

现在,我完全删除了Node类(尽管在新程序集中有类似的东西);将Style类移动到另一个程序集;已将其重命名为BaseModelMyModelYourModel;将BaseModel及其Description属性更改为抽象;并更改了YourModel所以它现在看起来像:

public sealed class YourModel : BaseModel
{
   public double Constant {get; set;}
   public bool UseDefaults {get; set;}
   public NewDefaultValuesClass Defaults {get; set;}
   public override Description => "This is your model";
}

我想将<Constant> XML标记映射到YourModel.Constant,将<DefaultValues> XML标记映射到YourModel.UseDefaultsYourModel.Defaults,并提供基于的预定义处方事实上它是YourStyle类型(或者只使用YourModel中提供的默认值)。

如果我保持Node(可能是BaseStyle及其子项?),我可以编写一些自定义反序列化代码,或编写转换实用程序以从上下文菜单或加载过程中运行,但是我宁愿不保留Node。我也不愿意将任何XML元素重命名为“Node”,因为这会让人感到困惑。既然我知道现有XML的结构,我是否可以使用它来填充新的MyModelYourModel对象,而不需要Node的类定义?

我希望这一切都有意义,如果我需要澄清,请发表评论。

0 个答案:

没有答案