XmlSerializer是否支持属性名称更改(版本容错)

Eri*_*let 6 c# properties version xmlserializer

我有

public bool Included { get; set; }
Run Code Online (Sandbox Code Playgroud)

我想改为:

public bool IsIncluded { get; set; }
Run Code Online (Sandbox Code Playgroud)

我想要向后兼容.我想只在代码中定义IsIncluded,但是能够读取属性为"Included"的旧xml.

XmlSerializer是否支持它以及如何支持它?

注意:我尝试没有成功...(不反序列化)

    public bool IsIncluded { get; set; }

    [Obsolete]
    public bool Included
    {
        set { IsIncluded = value; }
        get { return IsIncluded; }
    }
Run Code Online (Sandbox Code Playgroud)

更新我只是想添加我更喜欢我的解决方案,因为我希望我的xml变成IsIncluded,对我而言,更合适.像我一样(下面的解决方案),将使我能够更改xml,但保持以前的版本正常工作.从长远来看,我可能会删除代码以支持旧版本.

更新2018-02-01请在下面的解决方案和建议的解决方案中查看Greg Petersen的评论.他提出了一个很好的解决方案,以便将校正封装在应该完成的地方(类).哇!!!

Eri*_*let 5

我找到了。我就是这样做的。

// ******************************************************************
public static SimulScenario LoadFromFile(string path)
{
    if (!File.Exists(path))
    {
        return new SimulScenarioError(path);
    }

    SimulScenario simulScenario = null;
    XmlTextReader reader = new XmlTextReader(path);
    XmlSerializer x = new XmlSerializer(typeof(SimulScenario));

    x.UnknownAttribute +=x_UnknownAttribute;
    x.UnknownElement += x_UnknownElement;
    x.UnknownNode += x_UnknownNode;
    x.UnreferencedObject += x_UnreferencedObject;

    try
    {
        simulScenario = (SimulScenario)x.Deserialize(reader);
    }
    catch (Exception)
    {
        return new SimulScenarioError(path);
    }
    finally
    {
        reader.Close();
    }

    return simulScenario;
}

static void x_UnreferencedObject(object sender, UnreferencedObjectEventArgs e)
{

}

static void x_UnknownNode(object sender, XmlNodeEventArgs e)
{

}

static void x_UnknownElement(object sender, XmlElementEventArgs e)
{
    var simulChangeState = e.ObjectBeingDeserialized as SimulChangeState;
    if (simulChangeState != null)
    {
        if (e.Element.Name == "Included")
        {
            bool val;
            if (bool.TryParse(e.Element.InnerText, out val))
            {
                simulChangeState.IsIncluded = val;
            }
            else
            {
                throw new FileFormatException(Log.Instance.AddEntry(LogType.LogError, "Invalid scenario file format."));
            }
        }
    }
}

static void x_UnknownAttribute(object sender, XmlAttributeEventArgs e)
{

}
Run Code Online (Sandbox Code Playgroud)