XmlSerializer 是否支持属性名称更改(版本容忍) [英] Does XmlSerializer support property name changes (version tolerant)

查看:35
本文介绍了XmlSerializer 是否支持属性名称更改(版本容忍)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有

public bool Included { get; set; }

我想更改为:

public bool IsIncluded { get; set; }

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

I want to have backward compatibility. I'd like to only have IsIncluded defined in code but being able to read old xml where the property would be "Included".

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

Does XmlSerializer support it and how ?

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

Note: I tried without success... (does not deserialize it)

    public bool IsIncluded { get; set; }

    [Obsolete]
    public bool Included
    {
        set { IsIncluded = value; }
        get { return IsIncluded; }
    }

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

Update I just want to add that I prefer my solution because I wanted that my xml become IsIncluded which, to me, is more appropriate. Doing as I did (solution below), would enable me to change the xml but keeping previous version working fine. In long term, I would probably be able to remove code to support old version.

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

Update 2018-02-01 Please take a look at Greg Petersen comment below solution and proposed solution. He propose a great solution in order to encapsulate the correction at the place (the class) where it should be done. WOW!!!

推荐答案

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

I found it. This is how I did it.

// ******************************************************************
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)
{

}

这篇关于XmlSerializer 是否支持属性名称更改(版本容忍)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆