6

私は持っている

public bool Included { get; set; }

私が変更したいこと:

public bool IsIncluded { get; set; }

後方互換性を確保したい。IsIncluded のみをコードで定義したいのですが、プロパティが "Included" になる古い xml を読み取ることができます。

XmlSerializer はそれをどのようにサポートしていますか?

注:私は成功せずに試しました...(デシリアライズしません)

    public bool IsIncluded { get; set; }

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

更新xml を IsIncluded にしたかったので、自分のソリューションを好むことを追加したいだけです。これは、私にとってより適切です。私が行ったように(以下の解決策)、xmlを変更できますが、以前のバージョンは正常に機能しています。長期的には、古いバージョンをサポートするためにコードを削除できる可能性があります。

更新 2018-02-01解決策と提案された解決策の下にある Greg Petersen のコメントをご覧ください。彼は、修正を行うべき場所 (クラス) で修正をカプセル化するための優れたソリューションを提案しています。おお!!!

4

3 に答える 3

4

見つけた。これが私がやった方法です。

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

}
于 2013-12-19T18:59:57.850 に答える
3

試してみる:

[XmlElement("Included")]
public bool IsIncluded { get; set; }

例。v1.c のシリアル化と v2.c の逆シリアル化:

namespace v1
{
    public class c
    {
        public bool Included { get; set; }
    }
}

namespace v2
{
    public class c
    {
        [XmlElement("Included")]
        public bool IsIncluded { get; set; }
    }
}

namespace ConsoleApplication1
{
    public class Program
    {
        static void Main(string[] args)
        {
            StringWriter sw = new StringWriter();
            new XmlSerializer(typeof(v1.c)).Serialize(sw, new v1.c{ Included=true} );

            StringReader sr = new StringReader( sw.ToString() );
            v2.c cc = (v2.c)new XmlSerializer(typeof(v2.c)).Deserialize(sr);

            Debug.Assert(cc.IsIncluded);
    }
}

}

于 2014-08-22T12:42:10.823 に答える