将“旧”xml反序列化为新的类实例

时间:2010-09-17 10:42:06

标签: c# xml serialization

我有一个看起来像

的课程
public class MyClass
{
    public string EmployerName;
    public string EmployerSurname;
    public string EmploeeName;
    public string EmploeeSurname;
}

我已经将上面的代码重构为:

public class MyClass
{
    public MyClass()
    {
        Employer = new PersonInfo();
        Emploee = new PersonInfo();
    }

    public class PersonInfo
    {
        public string Name;
        public string Surname;
    }
    public PersonInfo Emploee;
    public PersonInfo Employer;

    [Obsolete]
    public string EmploeeName
    {
        get
        {
            return Emploee.Name;
        }
        set
        {
            Emploee.Name = value;
        }
    }
    [Obsolete]
    public string EmploeeSurname
    {
        get
        {
            return Emploee.Surname;
        }
        set
        {
            Emploee.Surname= value;
        }
    }
    [Obsolete]
    public string EmployerName
    {
        get
        {
            return Employer.Name;
        }
        set
        {
            Employer.Name = value;
        }
    }
    [Obsolete]
    public string EmployerSurname
    {
        get
        {
            return Employer.Surname;
        }
        set
        {
            Employer.Surname = value;
        }
    }

问题是,当反序列化从旧类版本序列化的XML时,我希望新属性可以工作,内部对象的字段将被填充,但它们不会。

除了实现IXmlSerializable之外,我还可以修改新类以支持新旧版本的XML吗?或者IXmlSerializable可能是唯一的方法吗?

1 个答案:

答案 0 :(得分:5)

您是否只想支持反序列化的旧版本?如果是这样,你可以:

[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public string EmploeeName {
    get { return Emploee.Name; }
    set { Emploee.Name = value; }
}
public bool ShouldSerializeEmploeeName() { return false;}

bool方法告诉XmlSerializer永远不要这个,但它仍然是 read [Browsable]告诉它不要出现在DataGridView之类的内容中,[EditorBrowsable]告诉它不要出现在intellisense中(仅适用于引用 dll 的代码,而不是项目相同的项目中的代码。)