我有一个项目,其中包含一个获取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
类移动到另一个程序集;已将其重命名为BaseModel
,MyModel
和YourModel
;将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.UseDefaults
和YourModel.Defaults
,并提供基于的预定义处方事实上它是YourStyle
类型(或者只使用YourModel
中提供的默认值)。
如果我保持Node
(可能是BaseStyle
及其子项?),我可以编写一些自定义反序列化代码,或编写转换实用程序以从上下文菜单或加载过程中运行,但是我宁愿不保留Node
。我也不愿意将任何XML元素重命名为“Node”,因为这会让人感到困惑。既然我知道现有XML的结构,我是否可以使用它来填充新的MyModel
和YourModel
对象,而不需要Node
的类定义?
我希望这一切都有意义,如果我需要澄清,请发表评论。